続・2章 練習問題

1章はイントロダクションなので2章から。

2-1

コマンドラインからファイル名のリストを受け取り、grepで1,000バイト未満のファイルを選択し、mapを使って先頭にスペース4文字、末尾に改行をつけて表示する。

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

# my @selected_files = grep -s $_ < 1000, @ARGV;
# print map { q/ / x 4 . $_ . qq/\n/ } @selected_files;

print map {
    q/ / x 4 . $_ . qq/\n/
        if ( -s $_ < 1000 );
} @ARGV;

コメントアウトしてあるのがまず仕様通りに書いたやつ。下のがgrep使わないで短くしてみたやつ。テキストのmapの説明では条件を満たさなかった時に明示的に空リストを返してるんだけど、返さなくても動いた。これは大丈夫なのかな。

2-2

パターンを入力し、あるディレクトリにあるファイルからパターンにマッチするファイル名のリストを表示する。スラッシュの入力は禁止、空文字列で終了、誤ったパターンを入力しても終了しないようにする。

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

my @dir_list = </etc/*>;

while (1) {
    print "input your pattern: ";
    chomp(my $regexp = <STDIN>);

    last if $regexp =~ m!^\s*$!s;
    next if $regexp =~ m!/!;

    eval {
        my @matched_list = grep m!$regexp!, @dir_list;
        print map { q/ / x 2 . $_ . qq/\n/ } @matched_list;
    };
    warn $@ if $@;
}

スラッシュの入力は禁止っていうのはスラッシュは入力されないと見なしても良いってことなのかな。模範解答には判別してる部分がないんだけど。あと、気になってPBPで調べてみたらグロブは<>じゃなてglob使えって書いてあったので覚えておこう。