回答編集履歴

1

13:11のコメント後追記

2016/10/25 06:07

投稿

ikedas
ikedas

スコア4443

test CHANGED
@@ -9,3 +9,46 @@
9
9
 
10
10
  というわけで、ご質問のメッセージでは「$elm\[2] in hash element」つまりハッシュの要素のうち$elm\[2]の値が未定義だと言っています。すぐ上で、入力された行をsplit()で分割したものを@elmに値を代入していますが、3番目の要素がなかったので代入されなかったのではないでしょうか。
11
11
 
12
+ ---
13
+
14
+ (**13:11のコメント後追記**)
15
+
16
+ Perlのドキュメントを読みましょう。日本語になっているのもあります。組み込み関数の説明はperlfuncですね。
17
+
18
+ - [perlfunc - Perl 組み込み関数](http://perldoc.jp/docs/perl/5.20.1/perlfunc.pod)
19
+
20
+ これで[split](http://perldoc.jp/func/split)を調べると、こんなことが書いてあります。
21
+
22
+ > split /PATTERN/,EXPR,LIMIT
23
+ > split /PATTERN/,EXPR
24
+ > split /PATTERN/
25
+ > split
26
+
27
+ > 文字列 EXPR を文字列のリストに分割して、リストコンテキストではそのリストを 返し、スカラコンテキストではリストの大きさを返します。
28
+
29
+ (中略)
30
+
31
+ > LIMIT が省略されると(あるいは等価な 0 なら)、普通は負数が指定されたかのように 動作しますが、末尾の空フィールドは取り除かれるという例外があります (先頭の空フィールドは常に保存されます); もし全てのフィールドが空なら、 全てのフィールドが末尾として扱われます(そしてこの場合取り除かれます)。 従って、以下のようにすると:
32
+ >
33
+ > ```
34
+ > print join(':', split(',', 'a,b,c,,,')), "\n";
35
+ > ```
36
+ >
37
+ > 出力 'a:b:c' を生成しますが、以下のようにすると:
38
+ >
39
+ > ```
40
+ > print join(':', split(',', 'a,b,c,,,', -1)), "\n";
41
+ > ```
42
+ >
43
+ > 出力 'a:b:c:::' を生成します。
44
+
45
+ (以下略)
46
+
47
+ というわけで、ご質問のコードでは`split(/,/,$_);`としているので、たとえば「`x,,,,,,,`」といった入力があれば2番目以降の空フィールドは取り除かれます。つまり未定義になります。`split(/,/,$_,9)`とすれば、8番目までのフィールドは空でも取り除かれないので未定義になりません。
48
+
49
+ ---
50
+
51
+ ほかにも、わからないことがあればドキュメントを読みましょう。ほとんどのことはドキュメントを読めば書いてあります。
52
+
53
+ なお、どんなドキュメントがあってどこを読めばいいかわからなければ、まずはPerlについて解説している書籍を買って、通読して下さい。それに説明があるはずです。
54
+