3

コードにuninitialized value in string eq at *** line xxx警告が表示されますが、実際にその行にある場合は簡単に修正できますeq

ただし、hashref内の値には正規表現の一致があります。

if ($hashref->{parameters}->{type} =~ m/:/) {

この前のいくつかの行私はこれさえ持っています:

$hashref->{parameters} = defined($hashref->{parameters}) ? $hashref->{parameters} : '';
$hashref->{parameters}->{type} = defined($hashref->{parameters}->{type}) ? $hashref->{parameters}->{type} : '';

したがって、値は少なくとも初期化する必要があります。

私は自分自身とあなたに尋ねています:なぜ私はまだ値が初期化されていないという警告を受け取るのですか、さらになぜそれはeq代わりに言うのですか?pattern match

編集:

parametersサブハッシュには、URL入力(postおよび/またはget)を介して指定されたすべての変数が含まれます。値は、URLに含まれる可能性typeのある変数の1つです。値がURLに含まれているかどうかは関係ありません。値が含まれている場合は、常に警告が表示されます。バグのある行の前に警告して行を入力する値を制御しても。typeuninitialized value in string eq

2.編集: @ikegamiが想定したように、実際elsifに警告の原因となったものがあります

if-elsifステートメント全体は次のようになります。

if ($hashref->{parameters}->{type} =~ m/:/) {
    …
elsif ($hashref->{parameters}->{type} eq $somevalue) {
    …
}

それは初期化され$somevalueていませんでした。

4

1 に答える 1

6

その行にはステートメントの半分しか表示されていません。完全なステートメントは実際には次のようになります

456: if ($foo =~ /bar/) {
457:    ...
458: }
459: elsif ($baz eq 'qux') {
460:    ...
461: }

ステートメントの実行時の警告は、通常、ステートメントが開始された行番号を使用するため、正規表現が一致せず、定義されていない場合は、 459 行目$bazに対して 456 行目で警告が表示されます。eq

ここでも同じ考えです:

$ perl -wE' my $x;  # 1
            say     # 2
            4       # 3
            +       # 4
            $x      # 5
            +       # 6
            5;      # 7 '
Use of uninitialized value $x in addition (+) at -e line 2.
9

elsif最近*、この種の問題を回避するために条件が別のステートメントと見なされるように Perl が変更されました。古いバージョンの Perl が必要です。

  • — 実は、最近ではありません。5.10 と 5.12 の両方が廃止されましたが、それよりも古いバージョンを使用しているようです。かなり古いバージョンの Perl について質問する場合は、そのことについて言及してください。

$ perlbrew use 5.10.1

$ perl -we'
my ($x,$y,$z);
if ($x) {
} elsif ($y eq $z) {
}'
Use of uninitialized value $y in string eq at -e line 4.
Use of uninitialized value $z in string eq at -e line 4.

$ perlbrew use 5.8.9

$ perl -we'
my ($x,$y,$z);
if ($x) {
} elsif ($y eq $z) {
}'
Use of uninitialized value in string eq at -e line 3.
Use of uninitialized value in string eq at -e line 3.
于 2012-08-02T16:12:29.990 に答える