きよへろのPerlコードをリファクタしようのコーナー No.3

さらに、今回の課題。
入力で渡したファイルの行頭に、行番号を加えるスクリプト

第3回目が始まってるようなのでやってみる。でも、今回は id:kiyohero のコードそのものが結構シンプルで直しどころがあんまりない。

#!/usr/bin/perl
use strict;
use warnings;

while(<>){
    printf "%3d:%s", $., $_;
}
  • <STDIN> → <> でもよかろう
  • print でもいいけど prinf で桁そろえしてもいいかな

こんぐらいでしょうか。でも、これじゃ面白くないので敢えて難しく書いてみる。無駄に OO。

  • kiyohero.pl
  • lib/
    • lib/FileHandle/LineNumber.pm

という構成になります。で、FileHandle を継承した FileHandle::LineNumber を作る。

package FileHandle::LineNumber;
use strict;
use warnings;
use base qw (FileHandle);

sub getline_with_number {
    my $line = shift->getline;
    $line ? sprintf "%3d: %s", $., $line : return;
}

1;

kiyohero.pl からこれを使う。FindBin でライブラリのパスを見つけてるのがミソ。

#!/usr/local/bin/perl
use strict;
use warnings;
use FindBin;
use lib "$FindBin::Bin/lib";
use FileHandle::LineNumber;

my $fh = FileHandle::LineNumber->new(shift) or die $!;
while (my $line = $fh->getline_with_number) {
    print $line;
}

1;

リファクタリングというか、君ならどう書くのコーナーになりつつあります。