「続・初めての Perl」勉強1日目

今度は「続・初めての Perl」です。あんまし基礎を理解してない気もするが、とりあえず先に進めてみる。

第二章 中級者の基礎知識

練習問題1

コマンドラインからファイル名のリストを受け取り、grep を使って1,000バイト未満のファイルを選択するプログラムを書いてください。map を使ってリスト内の文字列の先頭に4文字分のスペースを追加し、文字列の後に改行を付加します。最後に、得られたリストを表示します。

これはファイルを展開して中身を精査するのだろうか?
たぶん @ARGV で引数を取得するんだろうけど、どーやって1000バイドと判別するのか分からん。
ごめん、解答見た。

#!/usr/local/bin/perl -w

my @smaller_than_1000 = grep { -s $_ < 1000 } @ARGV;

print map { "    $_\n" } @smaller_than_1000;

grep の -s が何を指してるのか分からない。って言うかこれ無印にも続にも出てきてないんだけど。
と言うわけで聞いてみた(誰
-s はファイルテスト演算子の1つで、ファイルサイズを返すみたい。これは知らない(と言うか無印で出てきたけど、使ってないうえに一覧だけしか載ってなかったから覚えてない件)

練習問題2

ユーザにパターンの入力を求めるプログラムを書いてください。パターンはコマンドライン引数として受け取らず、キーボードからデータとして読み込みます。そして、ハードコードされたディレクトリに含まれていて、パターンにマッチするファイルのリストを表示します。ユーザがパターンの代わりに空文字列路入力するまで、これを繰り返します。Perl でのパターン指定の区切りとして伝統的に使われてきたスラッシュの入力を禁止して構いません。入力パターンは、末尾の改行によって区切られます。誤りのあるパターンを与えても、プログラムがクラッシュしないように手当てしてください。

できねー。

#!/usr/local/bin/perl -w

my $dir = "/Users/yu-suke/Documents/";
my @int = <STDIN>;
@int = split /\n/, @int;

eval {opendir DIR, $dir or die "Can not open $dir: $!"};

foreach $file (readdir DIR) {
    my $i;
    $i += 1;
    eval {
        if (/@int[$1]/) {
            print "$file\n";
        };
    }
}

closedir DIR;

あまりにもアレな感じで萎えるんだが、失敗したのは確かです(哀
解答

#!/usr/local/bin/perl -w

chdir;

while (1) {
    print "Please enter a regular expression> ";
    chomp (my $regex = <STDIN>);
    last unless (defined $regex && lengt $regex);

    print map {"   $_\n"} grep {eval {/$regex/} }
        glob(".* *");
}

優しくない。。。

第三章 モジュールの使い方

CPAN とかはすでに入ってる(はず)

練習問題1

カレントディレクトリのファイルリストを読み込み、名前をフルパスに変換してください。カレントディレクトリの読み込みのためにシェルなどの外部プログラムを使っては行けません。Perl 付属のモジュール File::Spec と Cwd が役に立ちます。2章の練習問題1と同じように、1つ1つのフルパスの先頭に4文字分のスペースを付け、末尾に改行を付けてください。

できたけど、すげー面倒なやり方な気がする。でもこーゆー風にしか書けない。

#!/usr/local/bin/perl -w

use Cwd;
use File::Spec;

$dir = cwd;

opendir (DIR, "$dir");
my @files = readdir(DIR);
closedir(DIR);

foreach $file(@files) {
    my @list = "$dir/$file";
    @list = map "    $_\n", @list;
    print "@list";
}
練習問題2

本書の裏表紙に書かれている ISBN コード(4873113059)を解析してください。CPAN から Business::ISBN モジュールをインストールし、これを使って数値から国別コードと出版社コードを抜き出してください。

まずモジュールインストールにひどく手間取った。結局たろさんに教えてもらってインストールできた。(依存モジュールがあるとかしらねーよw)
でまあ、インストールできたのはいいが、今度はそのモジュールの使い方が分からんかった。ググっても出てきやしない。とりあえず CPAN のところを見て自力でどうにかした。

#!/usr/local/bin/perl -w

use Business::ISBN;

$isbn = Business::ISBN->new('4873113059');

print "group code is ",$isbn->group_code, "\n";

print "publisher code is ",$isbn->publisher_code, "\n";

モジュールの使い方くらい本に載せておいてもいいだろうに。。。