第13章 ファイルとディレクトリの取り扱い 練習問題 その1

出かけるまでにいかに、ここの更新と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: $!";

これで適切に動作します。

初めてのPerl

初めてのPerl

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