質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

45991閲覧

perl 「Use of uninitialized value」エラーの対処法

退会済みユーザー

退会済みユーザー

総合スコア0

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2016/10/25 02:33

Perlがやってもやってもなかなか身につかず、半ベソかいて
仕方なくやってます。。

ものすごく一部分で恐縮なのですが、

use warnings;

while(<FH>){
chomp($);
my @elm = split(/,/,$
);
$names{$elm[2]} = $i; #ここが43行目
push(@lines,$_);
$i++;
}

と記載している部分で、
Use of uninitialized value $elm[2] in hash element at test11.pl line 43, <FH> line 10000,

のようにuse warnings;を冒頭に書いているとエラーが出てしまいます。
43行目付近の何が良くないのかがわかりません。

値のセット?初期値化??

どなたか有識の方、御教授願えませんでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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 03:45

編集2016/10/25 06:07
ikedas

総合スコア4443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/10/25 04:11

警告メッセージの説明(perldiag)ここを見ると、詳細が把握できるのですね。 ありがとうございます。以後確認するようにします。 さて、本題の所なのですが、 元々csvファイルを読み込ませて、splitで分割しているのですが、 ひとつの段には8個の情報があり、 そのうち、csvで言う所の左から3番目のセルの情報のみ抜き出したいのです。 元々のcsvファイルにはしっかり要素としての情報が埋まっているのですが、 私の記載したスクリプト内では未定義で、 このためにこれが代入されていない、ということになるのでしょうか。。
退会済みユーザー

退会済みユーザー

2016/10/25 06:14

ありがとうございます。 何か知りたい説明ひとつの中に更に登場する横文字(専門用語)に鳥肌を立てながら、理解していっている最中で、説明を読むために、またその中の言葉のために書籍を探し、ネットで検索し、、で遅々たる進捗なのですが、頑張ります。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問