« 「すぐわかるPerl」7.5 カッコを使った記憶 | トップページ | 「すぐわかるPerl」7.7 1文字単位の痴漢にtr/// »

2008年6月17日 (火)

「すぐわかるPerl」 7.6 マッチした文字列と、その前後の文字列を扱う変数

$`:マッチする前までの文字列
$&:マッチした文字列
$':マッチした後の文字列

なお、$`の`はバッククォートと読む。
まず、ファイルを用意。

names.txt
Jimmy Page
John Paul Jones
John Bohnam
Robert Plant
Stevie Ray Vaughan

次のプログラムを実行。

# num -- 名前と名字を装飾付きで出力
$n=0;
while (<STDIN>){
chomp;
/ \S+ | /;
++$n;
print "*** $n ***\n";
print "Given Name:   $`\n";
if ($& ne " "){
print "Middle Name: ".substr($&,1,length($&)-2)."\n";
}
print "Family Name: $'\n";
print "\n";
}

実行結果

*** 1 ***
Given Name:   Jimmy
Family Name: Page

*** 2 ***
Given Name:   John
Middle Name: Paul
Family Name: Jones

*** 3 ***
Given Name:   John
Family Name: Bohnam

*** 4 ***
Given Name:   Robert
Family Name: Plant

*** 5 ***
Given Name:   Stevie
Middle Name: Ray
Family Name: Vaughan

ミドルネームがファイルにあるかどうかで表示を分けている。以下解説。

chomp;

これは$_の右側の改行コードを切り落とすのに使う。

/ \S+ | /;

左右に空白を持つ日空白1文字以上か、1文字の空白にマッチする。
つまり「ミドルネーム可、ファーストネームとラストネームの間の空白」にマッチする。

++$n;
print "*** $n ***\n";
print "Given Name:   $`\n";

番号付き見出し(*** 1 ***)と、名前の部分$`(マッチした文字列の前)
つまり、ミドルネームまたは名前と名字の間の空白をマッチ文字列として、その前の文字列を名前としている、と。

if ($& ne " "){
print "Middle Name: ".substr($&,1,length($&)-2)."\n";
}

$&はマッチ文字列。
$&が" "つまり空白でない場合にはprint文が処理される。

substrは部分文字列を返す関数。

substr(対象文字列,開始位置,長さ)

開始位置は通常0文字目。

lengthは文字列の長さを返す関数。

length(文字列)

結果的に

substr($&,1,length($&)-2))

は$&の1文字目から(文字列全体の長さから2を引いた)値まで。
具体的にはミドルネームの前後のブランクをカットする。

print "Family Name: $'\n";
print "\n";

これはわかる。
マッチした文字列の後の部分、つまり名字の表示。

■use Englishですっきり
Perlの特殊な変数($',$\,$`)をわかりやすいものに変えることができる。

先頭に
use English;

$_ $ARG れいのあれ
$. $INPUT_LINE_NUMBER現在入力中の行番号
$` $PREMATCH マッチ前
$& $MATCH マッチ文字列
$' $POSTMATCH マッチ後
$0 $PROGRAM_NAME 現在実行中のプログラム名

|

« 「すぐわかるPerl」7.5 カッコを使った記憶 | トップページ | 「すぐわかるPerl」7.7 1文字単位の痴漢にtr/// »

Perl」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/214806/41549098

この記事へのトラックバック一覧です: 「すぐわかるPerl」 7.6 マッチした文字列と、その前後の文字列を扱う変数:

« 「すぐわかるPerl」7.5 カッコを使った記憶 | トップページ | 「すぐわかるPerl」7.7 1文字単位の痴漢にtr/// »