初めてのPerl 第13章

練習問題の回答をメモ。

ex13-1
#!/usr/bin/perl
use strict;

unlink @ARGV;

## 何か問題があった時に、それをユーザに知らせる
# foreach (@ARGV) {
#   unlink $_ or warn "Can't unlink '$_': $!, continuing...\n";
# }
ex13-2
#!/usr/bin/perl
use strict;
use File::Basename;
use File::Spec;

my ($old, $new) = @ARGV;
if (-d $new) {
  my $basename = basename $old;
  $new = File::Spec->catfile($new, $basename)
}

rename $old, $new or warn "cannot rename '$old' to '$new': $!";

rename関数は mv に似てるけど、第2引数にディレクトリを指定しても気の利いたことはしてくれないので注意しよう。

ex13-3
#!/usr/bin/perl
use strict;
use File::Basename;
use File::Spec;

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

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

link $target, $link_name or warn "cannot link '$target' to '$link_name': $!";
ex13-4
#!/usr/bin/perl
use strict;
use File::Basename;
use File::Spec;

my $symlink = $ARGV[0] eq "-s";
shift @ARGV if $symlink;

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

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

if ($symlink) {
  symlink $target, $link_name or warn "cannot make symbolic link '$target' to '$link_name': $!";
} else {
  link $target, $link_name or warn "cannot make hard link '$target' to '$link_name': $!";
}
ex13-5
#!/usr/bin/perl
use strict;

my @all_files = glob "* .*";

foreach my $file (@all_files) {
  # ファイルがシンボリックリンクだったら
  if (-l $file) {
    my $where = readlink $file;
    print "$file -> $where\n";
  }
}

ファイルテストを使わなくても、以下のように実現できたみたい。

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

反省点

移植性と簡単に書けることを意識して、モジュールを積極的に使おう。