オブジェクトなファイルハンドルですね

Perlでこんなソースを書いたが、うまく動く。

use strict;
use warnings;
open my $fh,'|terapad';
print $fh 'test';
close $fh;

しかしこれはなんだと。そう思って調べたら非常におもしろいことがわかった。
この$fhというスカラー変数は、IO::Fileのインスタンスらしい。
そういえばPerl 5の時点でも所々オブジェクト指向を採用してるよね。
ファイルハンドルの実体はそんなオブジェクトなのかな。


それで調べてみると、こんな使い方ができるらしい。

use IO::File;
my $fh=IO::File->new('test.txt','+<');
my @lines=$fh->getlines();
print join(',' , @lines);
$fh->print('fooo');
$fh->close();

コンストラクタ使って作ってるけど、別にスカラー変数をファイルハンドルとしてopenでもOK。
use IO::File;としておけばこの機能は使える。
まぁこんな風にオブジェクト指向的に書けると。
それだけなんですけどね。
あとスカラー変数をファイルハンドルにつかうことは、ファイルハンドルをサブルーチンに渡すときとか便利らしい。
別にそうじゃなくても方法はあるけど煩雑みたいだから。
あとPerl 6ではFHなど書いてきた変数ではないファイルハンドルはなくなるみたい。


まぁ現時点では配列とかハッシュとかをオブジェクト指向的に操作することはできないね。

my @arr=(1..10);
@arr.push(@arr.shift()); # push(@arr,shift(@arr));
@arr.join(',').print(); # print join(',' , @arr);
@arr.grep({$_%2==0}).map({$_**2}).join(',').print(); # print join(',' , map{$_**2}( grep{$_%2==0}(@arr) ) );

Perl 6での書き方で書いてみた。検証してないけど。#以降はPerl 5での書き方。
Perl 6においてはPerl 5における->が軒並み.に変わるので注意。
pushとかshiftとかjoinとか、この表記法だとかなり便利ですね。
grepとかmapとかはこういう風に連ねていくとLINQ的でいいですね。
最後に .sayやら .printやら付ければ画面に出力されるのも便利かも。
上では.print()とメソッドであるのをわかりやすく書いてるけど、Perlでは()省略可ですよ。
普段joinはjoin ‘,’ , @arr;のように書いてるけど、紛らわしいから()付けてる。


なんかいろいろPerl 6について調べるならPugs入れた方がいいかな。
しかしPerl 6はいつかのクリスマスにリリースされるまではよくわからんわけで…
上に書いてある内容はもしかすると変わるかも知れない。
まぁさすがにこの程度なら変わる気はしないけど。
また考えておこう。