出かけるまでにいかに、ここの更新とRSSのチェックを済ますかが問題。
1. rmと同じ働きをするプログラムを書く
ここは単純に、
#!/usr/bin/env perl -w unlink @ARGV;
これでおっけ。エラー表示が必要な時は、foreachでファイルごとに削除してエラー処理をするようにすると良いね。
#!/usr/bin/env perl -w use strict; foreach (@ARGV) { unlink $_ or warn "error while removing $_: $!"; }
2.mvと同じ働きをするプログラムを書く
ポイントは移動先がディレクトリだったとき。
#これは $ ./ex13-2.pl source.txt dest/ #実際には以下と同等に動作する必要がある $ ./ex13-2.pl source.txt dest/source.txt
うちは、豪快にまちがいました。次のコードはその間違ったコード。
#!/usr/bin/env perl -w use strict; my ($src, $dst) = @ARGV; #移動先はディレクトリか? if (-d $dst) { #この部分が豪快にまちがい rename $src, $dst.'/'.$src or die "can't rename $src to $dst: $!"; } else { rename $src, $dst or die "can't rename $src to $dst: $!"; }
このままだと、以下のように実行したときおかしくなる。
$ ./ex13-3.pl /tmp/source.txt dest/ #実際には以下と同等に動作する $ ./ex13-3.pl /tmp/source.txt dest//tmp/source.txt
これじゃだめですな。解答みるまで気づかなかったよ。本文のとおり、File::Basename、File::Specモジュールをつかって適切に処理しないとだめですね。次は、解答を参考にしたコード。
#!/usr/bin/env perl -w use strict; use File::Basename; use File::Spec; my ($src, $dst) = @ARGV; # 移動先はディレクトリか? if (-d $dst) { # 移動元のファイルのベースネームと my $bname = basename $src; # 移動先のディレクトリ名を繋げる my $dst = File::Spec->catfile($dst, $bname); } rename $src, $dst or die "can't rename $src to $dst: $!";
これで適切に動作します。

- 作者: ランダル・L.シュワルツ,トムフェニックス,Randal L. Schwartz,Tom Phoenix,近藤嘉雪
- 出版社/メーカー: オライリージャパン
- 発売日: 2003/05
- メディア: 単行本
- 購入: 15人 クリック: 474回
- この商品を含むブログ (294件) を見る