Perlのエラーメッセージのコーナー。今回は
%s argument is not a HASH or ARRAY element or slice
です。「%sの引数が、ハッシュや配列の要素またはスライスではありません」と言って怒られています。
つまり、配列要素、ハッシュ要素、配列スライス、ハッシュスライスを引数に取る関数に、それ以外の引数を渡した、と言って、怒られている状態です。

Candied fruit

 たとえばdelete関数が考えられます。
 まず配列との使い方を考えます。delete関数は配列要素、配列スライスに作用して、その要素を削除します。

#! /usr/local/bin/perl
# deleteArray.pl -- 配列とdelete

use strict;
use warnings;
use 5.10.0;

my @arr = qw/ Dummy Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec /;

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";
say "---";

delete $arr[1];

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";
say "---";

delete @arr[0..3];

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";

[sample]$ ./deleteArray.pl
arr No.5 May
arr Number 13
whole arr Dummy Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
---
arr No.5 May
arr Number 13
Use of uninitialized value in join or string at ./deleteArray.pl line 19.
whole arr Dummy Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
---
arr No.5 May
arr Number 13
Use of uninitialized value in join or string at ./deleteArray.pl line 26.
Use of uninitialized value in join or string at ./deleteArray.pl line 26.
Use of uninitialized value in join or string at ./deleteArray.pl line 26.
Use of uninitialized value in join or string at ./deleteArray.pl line 26.
whole arr   Apr May Jun Jul Aug Sep Oct Nov Dec

 @arrという配列に、先頭($arr[0])にDummyを、$arr[1]〜$arr[12]にJanからDecまでの日付の配列を入れました。

 最初に$arr[5]を表示し、間違いなくMayが表示されました。
 次にarr Numberという見出しとともにscalar @arrつまり配列@arrの要素数を表示しました。これはDummy+1年の月数で13です。
 最後に、二重引用符の中に配列変数を入れて展開させました。Dummyを先頭にJanからDecまで正しく表示されています。

 次に

delete $arr[1];

で配列要素$arr[1]を削除しました。これは先頭から2番めのJanに当たります。

arr No.5 May
arr Number 13

は正しく表示されています。つまりdelete関数で削除した$arr[3]は空スロット(未定義値)になるだけで、$arr[0]〜$arr[2]および$arr[4]〜$arr12]の12要素は保持されます。

Use of uninitialized value in join or string at ./deleteArray.pl line 19.
whole arr Dummy Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

 警告は$arr[1](Janが入っていた)=未定義値を表示しようとしたからです。表示を見てみると、DummyとFebの間に空間が空いています。

delete @arr[0..3];

は配列スライス@arr[0..3]を削除しています。これで配列の先頭の4要素'Dummy', 'Jan', 'Feb', 'Mar'を格納されている4要素が削除されます。('Jan'を持つ$arr[1]はすでにdeleteしたので2回消すことになります。

arr No.5 May
arr Number 13
Use of uninitialized value in join or string at ./deleteArray.pl line 26.
Use of uninitialized value in join or string at ./deleteArray.pl line 26.
Use of uninitialized value in join or string at ./deleteArray.pl line 26.
Use of uninitialized value in join or string at ./deleteArray.pl line 26.
whole arr   Apr May Jun Jul Aug Sep Oct Nov Dec

 $arr[5]がMayであること、配列の要素数が13であることに変わりはありません。
 $arr[0]、$arr[1]、$arr[2]、$arr[3]が未定義値になりましたので警告が4回表示されています。ラスト

whole arr   Apr May Jun Jul Aug Sep Oct Nov Dec

はJan、Feb、Mayの3つ分が空白になっています。(正確には配列変数の二重引用符展開によって空要素の前後に空白が挟まれている、その空白のみが表示されている状態。)

 さて、おめあてのエラーを発生させてみましょう。

#! /usr/local/bin/perl
# deleteArrayErr.pl -- 配列とdelete(エラー)

use strict;
use warnings;
use 5.10.0;

my $year = 'Year';
my @arr = qw/ Dummy Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec /;

delete $year; # 11行目
delete @arr; # 12行目

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";
say "---";

delete $arr[1];

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";
say "---";

delete @arr[0..3];

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";

[sample]$ ./deleteArrayErr.pl
delete argument is not a HASH or ARRAY element or slice at ./deleteArrayErr.pl line 11.

 いきなり

delete $year; # 11行目

で実行が終わってしまいました。

 これは、スカラー変数$yearを削除しようとしたからです。ちなみにスカラー変数を未定義値化するには、undefを使います。ではこれを取り除きます。

#! /usr/local/bin/perl
# deleteArrayErr2.pl -- 配列とdelete(エラー2)

use strict;
use warnings;
use 5.10.0;

my $year = 'Year';
my @arr = qw/ Dummy Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec /;

#delete $year; # 11行目
delete @arr; # 12行目

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";
say "---";

delete $arr[1];

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";
say "---";

delete @arr[0..3];

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";

[sample]$ ./deleteArrayErr2.pl
delete argument is not a HASH or ARRAY element or slice at ./deleteArrayErr2.pl line 12.

 これも同様です。
 配列@arrを一気に空リストにするには、やはりundefが使えます。

#! /usr/local/bin/perl
# deleteArrayErr3.pl -- 配列とdelete3(undefの使用

use strict;
use warnings;
use 5.10.0;

my $year = 'Year';
my @arr = qw/ Dummy Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec /;

undef $year; # 11行目
undef @arr; # 12行目

say "Year ", $year;

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";
say "---";

delete $arr[1];

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";
say "---";

delete @arr[0..3];

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";

[sample]$ ./deleteArrayErr3.pl
Use of uninitialized value $year in say at ./deleteArrayErr3.pl line 14.
Year
Use of uninitialized value in say at ./deleteArrayErr3.pl line 16.
arr No.5
arr Number 0
whole arr
---
Use of uninitialized value in say at ./deleteArrayErr3.pl line 23.
arr No.5
arr Number 0
whole arr
---
Use of uninitialized value in say at ./deleteArrayErr3.pl line 30.
arr No.5
arr Number 0
whole arr

 エラーは出ません。未定義値のスカラー$yearおよび$arr[5]を表示したときの警告が出ているだけです。配列@arrの要素数はゼロで、二重引用符の中で表示しても何も表示しないだけで警告は出ません。

まとめると
 配列要素や配列スライスを削除するにはdelete
 配列そのものやスカラー変数を未定義値化するにはundef
を使います。

 配列要素や配列スライスを削除しても、そのスロットが未定義値化されるだけで、配列の要素数は変わりません。
 下では小の月を削除しています。

#! /usr/local/bin/perl
# deleteArray4.pl -- 配列とdelete4(スライスの削除

use strict;
use warnings;
use 5.10.0;

my $year = 'Year';
my @arr = qw/ Dummy Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec /;

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";
say "---";

delete @arr[2, 4, 6, 9, 11];

say "arr No.5 ", $arr[5];
say "arr Number ", scalar @arr;
say "whole arr @arr";

[sample]$ ./deleteArray4.pl
arr No.5 May
arr Number 13
whole arr Dummy Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
---
arr No.5 May
arr Number 13
Use of uninitialized value in join or string at ./deleteArray4.pl line 20.
Use of uninitialized value in join or string at ./deleteArray4.pl line 20.
Use of uninitialized value in join or string at ./deleteArray4.pl line 20.
Use of uninitialized value in join or string at ./deleteArray4.pl line 20.
Use of uninitialized value in join or string at ./deleteArray4.pl line 20.
whole arr Dummy Jan Mar May Jul Aug Oct Dec

 @arrの要素数は15で、$arr[5]はMayです。
 警告は2月、4月、6月、9月、11月の5回分表示されています。
 全月を表示すると、Feb、Apr、June、Sep、Novだけが表示されていません。
 (JulとAugは2ヶ月連続大の月なのでくっついて表示されています)

 ハッシュでも同様のエラーが出ます。1つだけ例を挙げましょう。

#! /usr/local/bin/perl
# deleteHash.pl -- ハッシュとdelete

use strict;
use warnings;
use 5.10.0;

my %hash = (
 Jan => 1,
 Feb => 2,
 Mar => 3,
 Apr => 4,
 May => 5,
 Jun => 6,
 Jul => 7,
 Aug => 8,
 Sep => 9,
 Oct => 10,
 Nov => 11,
 Dec => 12,

);

say "hash Number of May ", $hash{May};
say "hash Number ", scalar keys %hash;
say "whole hash ", join " ", sort {$a <=> $b} values %hash;
say "---";

delete @hash{qw/Jan Feb Mar/};
delete $hash{Dec};

say "hash Number of May ", $hash{May};
say "hash Number ", scalar keys %hash;
say "whole hash ", join " ", sort {$a <=> $b} values %hash;
say "---";

[sample]$ ./deleteHash.pl
hash Number of May 5
hash Number 12
whole hash 1 2 3 4 5 6 7 8 9 10 11 12
---
hash Number of May 5
hash Number 8
whole hash 4 5 6 7 8 9 10 11
---

 問題無いですね。
 キーをMayとするハッシュ要素は$hash{May}です。

 キーがJan、Feb、Marのハッシュスライスは@hash{"Jan", "Feb", "Mar"}です。この場合引用符とカンマは省略できません。
 qw演算子を使えば@hash{qw/Jan Feb Mar/}と書くことが出来ます。

 ハッシュ要素はスカラーだからシジルが$、ハッシュスライスはリストだからシジルが@になります。

 ハッシュの個数はkeysでキーのリストを得て、scalarで個数化しています。

 ハッシュの値一覧はvalues関数で取得しますが、順不同になります。この場合1から12の整数であるとわかっているので数字順にsortしてみました。
 5月と、1月から3月までの4要素を削除したので、8要素になりました。
 中身は、ちゃんと4 5 6 7 8 9 10 11月になっています。

 では、話題のエラーを発生させてみましょう。

#! /usr/local/bin/perl
# deleteHashErr.pl -- ハッシュとdelete(エラー)

use strict;
use warnings;
use 5.10.0;

my %hash = (
 Jan => 1,
 Feb => 2,
 Mar => 3,
 Apr => 4,
 May => 5,
 Jun => 6,
 Jul => 7,
 Aug => 8,
 Sep => 9,
 Oct => 10,
 Nov => 11,
 Dec => 12,

);

say "hash Number of May ", $hash{May};
say "hash Number ", scalar keys %hash;
say "whole hash ", join " ", sort {$a <=> $b} values %hash;
say "---";

delete @hash{qw/Jan Feb Mar/};
delete $hash{Dec};

say "hash Number of May ", $hash{May};
say "hash Number ", scalar keys %hash;
say "whole hash ", join " ", sort {$a <=> $b} values %hash;
say "---";

delete %hash; #37行目

say "hash Number of May ", $hash{May};
say "hash Number ", scalar keys %hash;
say "whole hash ", join " ", sort {$a <=> $b} values %hash;
say "---";

[sample]$ ./deleteHashErr.pl
delete argument is not a HASH or ARRAY element or slice at ./deleteHashErr.pl line 37.

 予定通り、ハッシュを削除しようとするとエラーになります。undefにしましょう。

#! /usr/local/bin/perl
# deleteHashFix.pl -- ハッシュとundef

use strict;
use warnings;
use 5.10.0;

my %hash = (
 Jan => 1,
 Feb => 2,
 Mar => 3,
 Apr => 4,
 May => 5,
 Jun => 6,
 Jul => 7,
 Aug => 8,
 Sep => 9,
 Oct => 10,
 Nov => 11,
 Dec => 12,

);

say "hash Number of May ", $hash{May};
say "hash Number ", scalar keys %hash;
say "whole hash ", join " ", sort {$a <=> $b} values %hash;
say "---";

delete @hash{qw/Jan Feb Mar/};
delete $hash{Dec};

say "hash Number of May ", $hash{May};
say "hash Number ", scalar keys %hash;
say "whole hash ", join " ", sort {$a <=> $b} values %hash;
say "---";

undef %hash; #37行目

say "hash Number of May ", $hash{May};
say "hash Number ", scalar keys %hash;
say "whole hash ", join " ", sort {$a <=> $b} values %hash;
say "---";

[sample]$ ./deleteHashErr.pl
delete argument is not a HASH or ARRAY element or slice at ./deleteHashErr.pl line 37.

[sample]$ ./deleteHashFix.pl
hash Number of May 5
hash Number 12
whole hash 1 2 3 4 5 6 7 8 9 10 11 12
---
hash Number of May 5
hash Number 8
whole hash 4 5 6 7 8 9 10 11
---
Use of uninitialized value in say at ./deleteHashFix.pl line 39.
hash Number of May
hash Number 0
whole hash
---

 問題なくハッシュが空になりました。空のハッシュ要素を表示しようとして警告が出ていますが、予定の行動です。
 ということで、ハッシュや配列の、要素やスライスを削除するのはdeleteだが、ハッシュや配列全体を消すことはできない、ということです。