Perlのドキュメントを読みましょう。日本語になっているのもあります。警告メッセージの説明はperldiagですね。
Use of uninitialized value%s
(W uninitialized) 未定義値を、あたかも既に定義されているかのように 使用しました。 これは、"" か 0 と解釈されますが、間違いの可能性があります。 この警告を止めるには、変数に定義された値を代入してください。
(以下略)
というわけで、ご質問のメッセージでは「$elm[2] in hash element」つまりハッシュの要素のうち$elm[2]の値が未定義だと言っています。すぐ上で、入力された行をsplit()で分割したものを@elmに値を代入していますが、3番目の要素がなかったので代入されなかったのではないでしょうか。
(13:11のコメント後追記)
Perlのドキュメントを読みましょう。日本語になっているのもあります。組み込み関数の説明はperlfuncですね。
これでsplitを調べると、こんなことが書いてあります。
split /PATTERN/,EXPR,LIMIT
split /PATTERN/,EXPR
split /PATTERN/
split
文字列 EXPR を文字列のリストに分割して、リストコンテキストではそのリストを 返し、スカラコンテキストではリストの大きさを返します。
(中略)
LIMIT が省略されると(あるいは等価な 0 なら)、普通は負数が指定されたかのように 動作しますが、末尾の空フィールドは取り除かれるという例外があります (先頭の空フィールドは常に保存されます); もし全てのフィールドが空なら、 全てのフィールドが末尾として扱われます(そしてこの場合取り除かれます)。 従って、以下のようにすると:
print join(':', split(',', 'a,b,c,,,')), "\n";
出力 'a🅱️c' を生成しますが、以下のようにすると:
print join(':', split(',', 'a,b,c,,,', -1)), "\n";
出力 'a🅱️c:::' を生成します。
(以下略)
というわけで、ご質問のコードではsplit(/,/,$_);
としているので、たとえば「x,,,,,,,
」といった入力があれば2番目以降の空フィールドは取り除かれます。つまり未定義になります。split(/,/,$_,9)
とすれば、8番目までのフィールドは空でも取り除かれないので未定義になりません。
ほかにも、わからないことがあればドキュメントを読みましょう。ほとんどのことはドキュメントを読めば書いてあります。
なお、どんなドキュメントがあってどこを読めばいいかわからなければ、まずはPerlについて解説している書籍を買って、通読して下さい。それに説明があるはずです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/10/25 04:11
退会済みユーザー
2016/10/25 06:14