use strict;
use warnings;
while (<DATA>) {
while (m#/(\*?)(.*?)\1/#g) {
print "$2\n";
}
}
__DATA__
There are many who dare not kill themselves for [/fear/] of what the neighbors will say.
Advice is what we ask for when we already know the /* answer */ but wish we didn’t.
ワンライナーとして:
perl -nlwe 'while (m#/(\*?)(.*?)\1/#g) { print $2 }' input.txt
内側の while ループは、/g
修飾子とのすべての一致間で繰り返されます。後方参照により、同一の\1
開始/終了タグのみが一致することが保証されます。
複数の行にまたがるブロックを一致させる必要がある場合は、入力を丸呑みする必要があります。
use strict;
use warnings;
$/ = undef;
while (<DATA>) {
while (m#/(\*?)(.*?)\1/#sg) {
print "$2\n";
}
}
__DATA__
There are many who dare not kill themselves for [/fear/] of what the neighbors will say. /* foofer */
Advice is what we ask for when we already know the /* answer */ but wish we didn’t.
foo bar /
baz
baaz / fooz
一発ギャグ:
perl -0777 -nlwe 'while (m#/(\*?)(.*?)\1/#sg) { print $2 }' input.txt
-0777
スイッチとは、ファイルの丸呑みを引き起こします。$/ = undef
つまり、すべてのファイルがスカラーに読み込まれます。/s
また、ワイルドカード.
が改行に一致するように修飾子を追加しました。
正規表現の説明:m#/(\*?)(.*?)\1/#sg
m# # a simple m//, but with # as delimiter instead of slash
/(\*?) # slash followed by optional *
(.*?) # shortest possible string of wildcard characters
\1/ # backref to optional *, followed by slash
#sg # s modifier to make . match \n, and g modifier
ここでの "魔法" は、後方参照で星が必要になるのは、その*
前に星が見つかった場合だけであるということです。