このブログを検索

2010/11/05

print reverse<>;

引数に指定したファイルの内容をすべて表示するperlスクリプトを書け、と言われたら、私なら以下のように書く。

open IN,"<".$ARGV[0];

while(){
    print;
}


そしてperlって簡単だなァ・・・とニタニタする。しかし、実は以下のように書けばいいのである。

while(<>){
    print;
}


そしてもっと恐ろしいことには、

print <>;


でよい。そして、このときの引数は複数あってもよい。指定されただけのファイルについて、内容を表示する。そして、以下のようにすると、ファイル内容を逆順に、つまり最後の行から順に先頭の行まで表示する・・・

print reverse<>;


・・・・・。これは、実は一番最後のスクリプトを見たのである。そして、これでこうならもしかして、と、今書いたのと逆にさかのぼっていったのである。

これは、「初めてのPerl」からのネタです。「初P」では「ダイヤモンド演算子」ということでその使い方が説明してあるのでそれを読んでいればわかることですが、私はここを飛ばしていたのです。そして5章のハッシュのところを読み、最後の問題の答えを見ていたら、6章の答えである

print reverse<>;


が目に入ったわけです。今日は仕事がちょっとヒマだったので「初P」を読んでいたのですが、何度か吹き出しました。こういう冗談って、なかなか書けないですよね。絵文字も、(笑)ともかかずに、マジメな顔してあきらかに冗談であることがわかる文章を書くのって、難しいものです。

オブジェクト指向@perl

これもほぼ丸パクリである。

元は車だったのだが、人間に変えた。

package Man;

sub new{

    my $this = shift;
    my ( $name, $gender ) = @_ ;

    print "$nameさんが誕生しました。\n" ;

    my $man = {"Name" => $name,
    "Gender" => $gender,
    "Age" => 0,
    "Money" => 0 } ;

    bless $man, $this;
    return $man ;

}

# デストラクタ
sub DESTROY{

    my $this = shift;
    print "$this->{Name}($this->{Age})さんが死にました。\n";

}

sub tosi{
    $this = shift ;
    $this->{Age}++;
    print "$this->{Name}さんが$this->{Age}才になりました。\n\n" ;
}

sub tellage{
    my $this = shift;
    print "わたしは$this->{Name}、$this->{Age}才です。\n";
}

package main;

my $taro = new Man "太郎", "Male";

my $hanako = new Man "花子", "Female";

$taro->tosi;

print"\n";

$taro->tosi;

$hanako->tellage;
$hanako->tosi;
$hanako->tosi;
$hanako->tosi;
$hanako->tosi;
$hanako->tellage;

print"\n";


実行した結果。

C:\>perl man.pl
太郎さんが誕生しました。
花子さんが誕生しました。
太郎さんが1才になりました。


太郎さんが2才になりました。

わたしは花子、0才です。
花子さんが1才になりました。

花子さんが2才になりました。

花子さんが3才になりました。

花子さんが4才になりました。

わたしは花子、4才です。

太郎(2)さんが死にました。
花子(4)さんが死にました。

C:\>


最後の「死にました」は、何もしていないのに表示される。

終了するときに自動的にデストラクタが動いているようだ。

こういうものは、「C++入門」とかを読んで何度かやってみたことがあるが、いつもサンプルを写して、一部を今回のように変えて、「フーン・・・」で終わっている。おもしろそうだな、とは思うのだが・・・。