perlの特殊変数を実際に使ってみよう その1【$.】【$/】

戦友id:maroekunと特殊変数について語ったので、この機会に勉強しなおしてみる。

$.とはなんぞや

まずは、$. について学びなおしてみる。

  1. 意味を知る

ファイルから読み込み時の現在の行数

らしい。
ふむふむ


やってみる
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

こうなる


うむ。
なるほど。これは便利だ

  1. ○○行目まで読み込む
  2. ○○行目は取得しない

などを、

whileで回して、$count++して・・。

なんてやらなくていいわけだ。

次は、$/

まずは、$/ について学びなおしてみる。

  1. 意味を知る

入力時のレコード区切り文字。通常は改行。

らしい。
ふむふむ


やってみる。
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