「すぐわかる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」カテゴリの記事
- 「すぐわかるPerl」 8.10 ディレクトリのリカーシブ処理(その2)(2009.02.24)
- 「すぐわかるPerl」 8.10 ディレクトリのリカーシブ処理(その1)(2009.02.23)
- 「すぐわかるPerl」 7.6 マッチした文字列と、その前後の文字列を扱う変数(2008.06.17)
- 「すぐわかるPerl」 8.9 コマンドの入出力に入出力を切り替える(2008.11.12)
- 「すぐわかるPerl」 8.8 標準入出力以外のファイルの制御(2008.10.08)









コメント