今日はとてもばかげているようですが、私は非常に奇妙な問題があります。次のコードを考えてみてください:undefのチェックにもかかわらず、uninitailized変数に関する警告
#!/usr/bin/perl
use strict;
use warnings;
use warnings::unused;
use warnings FATAL => 'uninitialized';
my ($String, $Pattern);
$Pattern = "pattern";
$String = "pattern\n";
if (($String =~ m/^([^\ ]+).*$/s) &&
defined($1) &&
($1 =~ m/^.*$Pattern$/s)) {
print $1."\n";
}
このコードは次のように警告(その後、理由use warnings FATAL => 'uninitialized';
の停止)生産:
Use of uninitialized value $1 in concatenation (.) or string at [...]
私がテストしていので、$1
が定義されている場合、私は本当にこのことを理解していません(初期化されています)。犯人が最後の条件行(すなわち、($1 =~ m/^.*$Pattern$/s)
)であるようです。私がこれを離れると、警告は消えてしまいます。
なぜですか?私の理解によると、その行はちょうどのテスト$1
ですが、その値は変更されません($Pattern
)。そのRegExの残りの部分にはカッコが含まれていないので、$1
は一致する可能性があります。それについて考えながら
うーん、それは正規表現が一致したとき、Perlは正規表現で括弧があるかどうかに関係なく、すべてのケースを$1
を設定し、でその同僚かもしれないことを私の心に来ます。これは行動を説明するでしょう。本当ですか?
動作を示す簡単なテストケースを作成してみてください。私はこのコードに何か間違っているとは思わない。 – tinita
これが起こることはわかっていました...私は実際のコードを削除しようとします。 – Binarus
私は今質問をMCVEで更新しました。 – Binarus