初めてのPerl ~ 13章 ファイルとディレクトリの取り扱い ~

練習問題13.9.1

 rmコマンドと同じ働きをするプログラムを書け。
 このプログラムは、コマンドラインに指定したファイルを削除する

#!/usr/bin/perl

use warnings;
use strict;

foreach (@ARGV){
    unlink $_ or warn "Can't delete $_ \n";
}

練習問題13.9.2

 mvコマンドと同じ働きをするプログラムを書け。
 このプログラムは、1番目のコマンドライン引数で指定したファイルを、
 2番目のコマンドライン引数で指定した名前にリネームする。
 2番目の引数にディレクトリも指定するようにする。
 その場合、新しいディレクトリの中で、リネームする前と同じベース名を持つようにする。

#!/usr/bin/perl

use warnings;
use strict;

use File::Basename;
use File::Spec;

my($source,$target) = @ARGV;

if( -d $target ){
    my $base_name = basename $source;
    $target = File::Spec->catfile($target,$base_name); 
}

rename $source,$target or warn "Can't rename to $target from $source \n";

練習問題13.9.3

 lnコマンドと同じ動きをするプログラムを書け。
 1番目のコマンドライン引数に対して、2番目の引数で指定した名前を持った
 ハードリンクを作成する。

#!/usr/bin/perl

use warnings;
use strict;

use File::Basename;
use File::Spec;

my($source,$target)=@ARGV;

if(-d $target){
    my $base_name = basename $source;
    $target = File::Spec->catfile($target,$base_name);
}

link $source,$target or die "Can't hardlink";

練習問題13.9.4

 練習問題13.9.3にシンボリックリンク作成機能を追加せよ
 1番目の引数の前に-sを指定することで、ハードリンクの代わりに、
 シンボリックリンクを作成する。

#!/usr/bin/perl

use warnings;
use strict;

use File::Basename;
use File::Spec;

my $switch = $ARGV[0] eq "-s";
if ($switch){
    shift @ARGV;
}
my($source,$target)=@ARGV;

if(-d $target){
    my $base_name = basename $source;
    $target = File::Spec->catfile($target,$base_name);
}

if($switch){
    symlink $source,$target or die "Can't softlink";
}
else{
    link $source,$target or die "Can't hardlink";
}

練習問題13.9.5

 カレントディレクトリのシンボリックリンクを探して、表示する。

#!/usr/bin/perl

use warnings;
use strict;

my $link;
foreach(<* .*>){
    if ($link = readlink $_){
       print "$link \n" 
    }
}

参考書

初めてのPerl

初めてのPerl