2011年 06月 15日

Ruby の scan を Perl でどうやるか忘れる

よく忘れるので memo

str =  '<11> <22> <33> <44>'

str.scan(/<(\d+)>/) { # ブロック付き
    warn $1
}

str.scan(/<(\d+)>/) # ブロック無し (Array がかえる)

を Perl でやるとき

my $str = '<11> <22> <33> <44>';

# たぶん正統派 (ブロック付き)
while ($str =~ m{<(\d+)>}g) {
	warn $1;
}

# ↑ の書きかたを忘れるのでよくやってしまうやつ  (ブロック付き) ↓
$str =~ s{<(\d+)>}{
	warn $1;
	$&; # 破壊してもいいときはつけない
}eg;

# ブロック無し (Array Ref.)
my $matched = [ $str =~ m{<(\d+)>}g ];