1. ホーム
  2. perl

[解決済み] Use of uninitialized value in string ne "というエラーはどこから発生するのでしょうか?

2022-02-26 15:13:01

質問

の初期化されていない値はどこにあるのでしょうか? 以下のコード ?

#!/usr/bin/perl
use warnings;

my @sites = (undef, "a", "b");
my $sitecount = 1;
my $url;

while (($url = $sites[$sitecount]) ne undef) {
   $sitecount++;
}

出力します。

Use of uninitialized value in string ne at t.pl line 6.
Use of uninitialized value in string ne at t.pl line 6.
Use of uninitialized value in string ne at t.pl line 6.
Use of uninitialized value in string ne at t.pl line 6.

解決方法は?

を使用することはできません。 undef を文字列比較で使用すると、警告が表示されます。

if ("a" ne undef) { ... }

を実行すると警告が発生します。変数が定義されているかどうかをテストしたい場合は、使用してください。

if (defined $var) { ... }


元の質問についてのコメント。

配列に対して反復処理を行うのは奇妙な方法ですね。もっと普通のやり方は、次のようになります。

foreach my $url (@sites) { ... }

を削除し $sitecount を完全に上書きしないようにしましょう。 $url をループ本体で使用します。また undef の値を配列で指定します。もし、その undef を何らかの理由(あるいは未定義の値がそこに挿入されることを想定)で行うことができます。

foreach my $url (@sites) {
  next unless defined $url;
  ...
}

もし、ループの構成で未定義のテストをしたいのであれば、以下のものが必要です。

while (defined $sites[$sitecount]) {
  my $url = $sites[$sitecount];
  ...
  $sitecount++;
}

を使えば警告を避けることができますが、自動生成に注意する必要があります。 undef が他のライブ値の間に混在しています。