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
使えって書いてあったので覚えておこう。