perl \nを含む 文字列の置換の仕方?

[上に] [前に] [次に]
saka 1999/12/14(火) 00:47:15
こんばんわsakaと言います。
\nを含む文字列の置換(+切り出し)で少し気になる事がありお聞きしたいのですが。
$moji = "前の文\r\nSTART\r\n切り出し文\r\nEND\r\n後の文\r\n";
の様な文字列があり 下記のように置換すると上手くできません。
$moji =~ s/START(.*)END/g;
$kiri = $1;
一旦 \n を無くして
$moji =~ s/\r\n/\r/g;
$moji =~ s/START(.*)END/g;
$kiri = $1;
$moji =~ s/\r/\r\n/g;
$kiri =~ s/\r/\r\n/g;
行なうと上手くいくのですけど。
もっと簡単な方法があるのでしょうか?

B-Cus 1999/12/14(火) 01:03:32
# s// は文法エラーだと思いますが

> $moji =~ s/START(.*)END/g;
$moji =~ m/START(.*)END/s とか。

J.Naka 1999/12/14(火) 01:18:42
えーと、これは置き換えでなくマッチだけですよね。
マッチは m/マッチパターン/ です。
それと、置き換えは、s/マッチパターン/置き換えパターン/;です。

下のように、修飾子 s を付加すると複数行を単一文字列として扱うことになり、旨くいきます。perl5です。

$moji =~ m/START(.*)END/sg;

saka 1999/12/14(火) 01:20:59
B-Cus さんへ
># s// は文法エラーだと思いますが
間違っていますね。済みません。
$moji =~ s/START(.*)END/START/g;
が本当です。
STARTの文字だけを残して STARTとENDの間の文字を取り出したいのです。

saka 1999/12/14(火) 01:32:19
[[解決]]
J.Naka さんへ
>下のように、修飾子 s を付加すると複数行を単一文字列として扱うことになり、旨くいきます。perl5です。

$moji =~ s/START(.*)END/START/s;
でいいんですね。それに一回しか切り出さないのでgは不要でした。
perl4だと上手く使えないのですか?修飾子のsは?
一応動作を確認しました。

J.Naka 1999/12/14(火) 01:51:07
修飾子は、
prel4: gio
perl5: cgimosx
と、手元のリファレンス本に書いてあります。
#このリファレンス本は、この部分だけ妙に難解に書いてあるのよ(^^;;
#オンラインでは、http://www.kt.rim.or.jp/~kbk/perl5.005/perlfaq6.html#I_m_having_trouble_matching_over
に記述あります。

#あっB-Cusさんとニアミス

[上に] [前に] [次に]