■the m// Operator (Matching)
1. In scalar context, the operator returns true (1) if successful, false ("") otherwise.
ex.) If ($shire =~ /Baggins/) {..........}
2. In list context, m// returns a list of substrings matched by the capturing parentheses in the pattern.
In list context, m//g returns a list of all matches found.
If there are no capturing parentheses within the /g pattern, then the complete matches are returned. If there are capturing parentheses, then only the strings captured are returned.
If the match fails in list context, a null list is returned.
If the the match succeeds in list context, but there were no capturing parentheses nor /g, a list value (1) is returned.
ex.) If (($key, $value) = $string =~ /(\w+): (.*)/) {..........}
ex.) If (@perls = $paragraph =~ /perl/gi) {..........}
3. その他
ex.) %hash = $string =~ /(\w+)=(\w+)/g;
■the s/// Operator (Substitution)
1. The return value of an s/// operation (in scalar and list contexts alike) is the number of times it succeeded (which can be more than once if used with the /g modifier).
On failure, since it substituted zero times, it returns false(""), which is numerically equivalent to 0.
ex.) If ($lotr =~ s/Bilbo/Frodo/) {..........}
ex.) $change_count = $lotr =~ s/Bilbo/Frodo/g;
2. その他
ex.) s/revision|version|release/\u$&/g; #大文字化
ex.) s{version\s+([0-9.]+)}{$Names{$1}?"The $Names{$1} release":$&}xge; #コードの実行結果が置換文字列として使われる
ex.) ($date = $pp_data->[4]) =~ s/^\d{4}\///g; #shiromuku(r2)BBS
ex.) for (@new = @old) {s/Bilbo/Frodo/} #@oldの内容を変えたくない場合
ex.) for ($new = $old) {s/^\s+//; s/\s+$//; s/\s+/ /;} #$newの先頭の空白文字を削除、最後の空白文字を削除、中間にある空白文字の連続を一個の空白文字に変える
ex.) 1 while $number =~ s/(\d)(\d\d\d)(?!\d)/$1,$2/; #数字にコンマ付加
ex.) 1 while $string =~ s/\b(\w+) \1\b/$1/gi; #"this this"→"this"
■Capturing and Clustering
ex.) /foo((?-i)bar)/i #"bar" must be lower case(Capturingあり)
/foo(?-i:bar)/i #"bar" must be lower case(Capturingなし)
■Alternation
ex.) /pro(b|n|r|l)ate/ #(Capturingあり)
/pro(?:b|n|r|l)ate/ #(Capturingなし)
ex.) /com(pound|)/ #Matches "compound" or "com"("com"の場合$1はdefined null string)
/com(pound)?/ #Matches "compound" or "com"("com"の場合$1はundefined)
■qr/pattern/imosx
ex.) $cat = qr/\d+/;
if ($filename =~ /^($cat)\_(\w+)\.cgi$/o) {..........}
ex.) @regexes = ();
@regexes = map {qr/$_/} @patterns;
foreach $item(@data) {
foreach $re(@regexes) {
if ($item =~ /$re/) {..........}
}
}
■Lookaround Assertions
ex.) 1 while $string =~ s/\b(\w+)\s(?=\1\b)//gi; #positive lookahead("this this"→"this")
ex.) 1 while $string =~ s/\b(\w+)\s(?=\1\b(?!'\w))//gi; #negative lookahead("The clothes you DON DON't fit."を回避)
ex.) s/(?<=c)ei/ie/g #positive lookbehind (前に"c"がある"ei"を"ie"に置換
ex.) s/(?<!c)ei/ie/g #negative lookbehind (前に"c"がない"ei"を"ie"に置換
■the /e modifier
ex.) s/(\d+)/$1*2/e; #"42"を"84" に置換
ex.) s/\b(\d+\.?\d*)C\b/int($1*1.8+32) . "F"/e; #233C → 451F
ex.) s/^(\d+)(?=:)/$1+100/e; #行の最初の数字(後に":"が付いている)を100増加
ex.) s/(\$\w+)/$1/eg; #スカラー変数を展開
ex.) $_ = "I have 4+19 dollars and 8/2 cents.\n";
s{(\d+\s*[+*/-]\s*\d+)}{$1}eg;
print; #"I have 23 dollars and 4 cents."になる
2003年10月27日(月)
No.45