perlの特殊変数を実際に使ってみよう その1【$.】【$/】
戦友id:maroekunと特殊変数について語ったので、この機会に勉強しなおしてみる。
$.とはなんぞや
まずは、$. について学びなおしてみる。
- 意味を知る
ファイルから読み込み時の現在の行数
らしい。
ふむふむ
やってみる
test.txt
aa:aa bb:bb cc:cc dd:dd ee:ee
perl_tokusyu_hensu_001.pl
#!/usr/bin/perl use strict; use warnings; print "\$. test===================\n"; open my $fh, '<', 'test.txt' or die $!; while (<$fh>) { print $.." $_"; }
結果
$. test=================== 1 aa:aa 2 bb:bb 3 cc:cc 4 dd:dd 5 ee:ee
なるほどね。
確かに、現在の読み込み件数が出てくる。
試しに・・・
open my $fh, '<', 'test.txt' or die $!; <$fh>; <$fh>; <$fh>; while (<$fh>) { print $.." $_"; }
こんなことをすると、
$. test=================== 4 dd:dd 5 ee:ee
こうなる
うむ。
なるほど。これは便利だ
- ○○行目まで読み込む
- ○○行目は取得しない
などを、
whileで回して、$count++して・・。
なんてやらなくていいわけだ。
次は、$/
まずは、$/ について学びなおしてみる。
- 意味を知る
入力時のレコード区切り文字。通常は改行。
らしい。
ふむふむ
やってみる。
test.txt
aa:aa bb:bb cc:cc dd:dd ee:ee
perl_tokusyu_hensu_002.pl
#!/usr/bin/perl use strict; use warnings; print "\$/ test===================\n"; open my $fh, '<', 'test.txt' or die $!; undef $/; my $text = <$fh>; print $text;
結果
上記のコードを実行すると、下記のようにtest.txtの内容が全てprintされる。
$/ test=================== aa:aa bb:bb cc:cc dd:dd ee:ee
もし、
undef $/;
の部分をコメントアウトすると、
$/ test=================== aa:aa
こんな結果になる。
うむ。
区切り文字がないので、要素は一つだと判断されるのか。
試しに・・・
$/ = ":"; while (<$fh>) { print "$. : $_\n\n"; }
こんなことをしてみる。
$/ に ":" を代入し、区切り文字の定義を変えてみる。
すると、
$/ test=================== 1 : aa: 2 : aa bb: 3 : bb cc: 4 : cc dd: 5 : dd ee: 6 : ee
見にくいが分かるだろうか・・・?
一行目が、"aa:"
二行目が、"aa\nbb:"
三行目が、"bb\ncc:"
となっている。
これが・・
便利な場合ってどんな場合だろう・・・?
一時、【CSV扱うとき便利かも!!】と思ったが、[,(カンマ)]で区切ると、最後のカラムと最後のカラムがくっついて出力されるしなぁ・・・。
うむむ。
なんか便利な使用方法知っている方いましたら、教えてくださいm(_ _)m