3

このPath::Classモジュールは一流のモジュールであり、cpan.orgで非常に良いレビューがあります。Path::Class:Dirモジュールが次のようなディレクトリツリーを作成できるかどうか疑問に思います*:

/home/scottie/perl/lib/Path-Class-0.25
  -> lib/
     -> Path/
        -> Class/
           -> Dir.pm
           -> Entity.pl
           -> File.pl
        -> Class.pl
  -> t/
     -> 01-basic.t
     -> 02-foreign.t
     -> 03-filesystem.t
     -> 04-subclass.t
     -> 05-traverse.t
     -> author-critic.t
  -> Build.PL
  -> Changes
  -> dist.ini
  -> INSTALL
  -> LICENSE
  -> Makefile.PL
  -> MANIFEST
  -> META.yml
  -> README
  -> SIGNATURE

*)ソース:Path-Class-0.25.tar.gzファイルと文字列の最後にある「/」はディレクトリを示します(ls -p* nixシステムのように)

そして、これは好きではありません(ルートからのフルパス):

  /home/scottie/perl/lib/Path-Class-0.25
  -> /home/scottie/perl/lib/Path-Class-0.25/lib/
     -> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/
        -> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/Class/
           -> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/Class/Dir.pm
           -> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/Class/Entity.pl
           -> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/Class/File.pl
        -> /home/scottie/perl/lib/Path-Class-0.25/lib/Path/Class.pl
  -> /home/scottie/perl/lib/Path-Class-0.25/t/
     -> /home/scottie/perl/lib/Path-Class-0.25/t/01-basic.t
     -> /home/scottie/perl/lib/Path-Class-0.25/t/02-foreign.t
     -> /home/scottie/perl/lib/Path-Class-0.25/t/03-filesystem.t
     -> /home/scottie/perl/lib/Path-Class-0.25/t/04-subclass.t
     -> /home/scottie/perl/lib/Path-Class-0.25/t/05-traverse.t
     -> /home/scottie/perl/lib/Path-Class-0.25/t/author-critic.t
  -> /home/scottie/perl/lib/Path-Class-0.25/Build.PL
  -> /home/scottie/perl/lib/Path-Class-0.25/Changes
  -> /home/scottie/perl/lib/Path-Class-0.25/dist.ini
  -> /home/scottie/perl/lib/Path-Class-0.25/INSTALL
  -> /home/scottie/perl/lib/Path-Class-0.25/LICENSE
  -> /home/scottie/perl/lib/Path-Class-0.25/Makefile.PL
  -> /home/scottie/perl/lib/Path-Class-0.25/MANIFEST
  -> /home/scottie/perl/lib/Path-Class-0.25/META.yml
  -> /home/scottie/perl/lib/Path-Class-0.25/README
  -> /home/scottie/perl/lib/Path-Class-0.25/SIGNATURE

私はそれをやろうとしましたが、私のコードに何か問題があります:

#------------------8<------------------
my $dir = Path::Class::Dir->new('/home/scottie/perl/lib/Path-Class-0.25');

my $nfiles = $dir->traverse(sub {
    my ($child, $cont) = @_;
    return if -l $child; # don't follow symlinks

    #print Dumper($child);
    #print "$child\n";

    print $child->{'dir'}{'dirs'}[-1];
    print " -> ";
    print $child->{'file'};
    print "\n";
    return $cont->();
});
#------------------8<------------------

私のコードをざっと見て、フルパスなしでディレクトリツリーを作成する方法を教えてください$child

どうもありがとう!

よろしく、
スコッティ

4

1 に答える 1

4

パスの最後の要素だけを抽出するには、のbasenameメソッドClass::Path::File(のメソッドとしても使用可能)を使用する必要があります。Class::Path::Dir

インデントの現在のレベルを追跡するには、コールバックのパラメーターも使用する必要があります。

このプログラムはあなたの要件を満たしているようです。

use strict;
use warnings;

use Path::Class;

my $dir = dir('/home/scottie/perl/lib/Path-Class-0.25');

$dir->traverse(sub {

  my ($child, $cont, $indent) = @_;
  $indent //= 0;

  if ($indent == 0) {
    print $child, "\n";
  }
  else {
    print '   ' x ($indent - 1), '-> ', $child->basename;
    print '/' if $child->is_dir;
    print "\n";
  }

  $cont->($indent + 1);
});
于 2012-05-15T00:50:52.520 に答える