perlの正規表現について教えてください

カマイタチ 1999/08/06(金) 00:14:39
$str = "abcdefghijklmn"; のとき、"abcdefgh" を取り出す・・・具体的には、初めて出てきた "ijk" の直前までを取り出す方法を教えてください。
葉月 1999/08/06(金) 01:13:20
た~んじゅんに、やっちゃうと
$str = "abcdefghijklmn";
$str =~ s/(^.*)(ijk.*)/$1/;
print $str;

# (^.*) : 行の最初から、改行以外のすべての文字にマッチ
# (ijk.*):ijkで始まり、その後ろは、改行以外のすべての文字にマッチ
# $1に(^.*)が代入され、$2に(ijk.*)が代入されるので、$strを$1に変換する

になるけど
葉月 1999/08/06(金) 01:22:03
いろいろと、つっこまれそうな書き方をしてしまった。。。
>変換
というより、置換でした。。。(他にも、ちょこちょこと...(--;;;)
ふじ 1999/08/06(金) 01:37:36
>$str =~ s/(^.*)(ijk.*)/$1/;
$str =~ s/(^.*?)(ijk.*)/$1/;
最小マッチにしないと、「最後に出て来たijk」の前の文字列、になりますね。

$str = "abcijkdefijklmn";
の場合に、 abc でなくて abcijkdef がひっかかる。

元の文字列を壊したくないなら
$str =~ /(^.*?)ijk/;
として $1 を参照するとか、
$str =~ /ijk/;
として $` を参照するとか。