メメメモモ

プログラミング、筋トレ、ゲーム、etc

$1の挙動でハマった

my $text = 'abcde';

# (1)                                                                                          
$text =~ m/(bc)/;
warn $1; # -> bc

# (2)                                                                                          
$text =~ m/(ce)/;
my $tmp = $1;
warn $tmp; # -> bc

# (3)
if ( $tmp ) {
   # do something for $tmp
}

(1)では、正規表現がマッチするので$1には"bc"が入ります。

(2)では、正規表現がマッチしません。
マッチしない場合は、$1には空が入るのかなぁと思ったのですが違いました。
$1には"bc"が入ったままとなります。

なので、(3)のように、(2)がマッチした場合に$tmpに対してなにか処理する、みたいなものだとうまく動きません。

そうしたい場合は、以下のようにする感じ。

my $tmp;
if ( $text =~ /(ce)/ ) {
    $tmp = $1;
}