2

Mac 10.5.7 で Perl 5.12 を使用しています。解凍したいJARファイルがあり、ファイルパターンに一致するファイルを処理します。解凍の結果を反復処理する方法がわかりません。私は持っている ...

### build an Archive::Extract object ###
my $ae = Archive::Extract->new( archive => $dbJar );

### what if something went wrong?
my $ok = $ae->extract or die $ae->error;

### files from the archive ###
my @files   = $ae->files;

for (@files) {
    print "file : $_\n";

しかし、ループから返されるのは「ARRAY(0x7fd5c22f7cd8)」だけです。アーカイブにたくさんのファイルがあることはわかっているので、ここで何が間違っているのか知りたいです。 - Dave

4

3 に答える 3

6

$ae->files配列ではなく、配列参照を返します。これを試して:

my $files = $ae->files;

for(@$files) {
   print "file : $_\n";
}
于 2013-02-26T22:58:46.300 に答える
1

Archive::Extractの Perldoc から:

$ae->ファイル

これは、アーカイブからのすべてのパスを保持する配列参照です。詳細については、extract() を参照してください。

メソッドが配列やハッシュではなく、それらへの参照を返すことは非常に一般的です。また、メソッドが配列やハッシュへの参照を引数として受け取ることも非常に一般的です。これは、メソッドと呼び出しの間でやり取りされるデータが少なくなるためです。

あなたはこれを行うことができます:

for my $file ( @{ $ae->files } ) {
    print "$file\n";
}

@{...} 参照を逆参照し、単純な配列にします。はい、私が行ったように、配列参照を返すメソッド呼び出しを配置できます@{...}

すでに述べたように、非常に役立つパッケージはData::Dumperです。これは参照を取得し、そこに含まれるデータ構造を表示できます。また、そのデータ構造が祝福されたオブジェクトを表しているかどうかもわかります。これは、データを引き出すために使用できる方法があるという手がかりになる可能性があります.

たとえば、Companyというオブジェクトがあるとします。Employee メソッドの 1 つは、 objectsへの配列参照を返す $company->Employees かもしれません。あなたはこれに気付かないかもしれませんがARRAY{0x7fd5c22f7cd8)、Data::Dumper を通してこれをプッシュすると、構造を理解するのに役立つかもしれません:

use Data::Dumper;
use Feature qw(say);

use Company;

[...]

@employee_list =  $company->Employees;

# say join "\n", @employee_list;   #Doesn't work.
say Dumper @employee_list;

これは次のように表示されます:

 $VAR = [
    {
        FIRST => 'Marion',
        LAST  => 'Librarian',
        POSITION => 'Yes Man',
    }  Employee,
    {
        FIRST => 'Charlie',
        LAST  => 'australopithecus`,
        POSITION => 'Cheese Cube Eater'
    }  Employee,
]

これがハッシュ参照の配列であることがわかるだけでなく、これらもオブジェクトですEmployee。したがって、クラスのいくつかのメソッドを使用して、必要なEmployee情報を解析する必要があります。

use Feature qw(say);
use Company;
use Employee;

[...]
for my $employee ( @{ $company->Employees } ) {
    say "First Name: " . $employee->First;
    say "Last Name: " . $employee->Last;
    say "Position: " . $employee->Position;
    print "\n";
}
于 2013-02-27T01:03:31.117 に答える
0

これをやってみてください:

use Data::Dumper;
print Dumper @files;

そうすれば、@files の内容が表示されます。

データ構造の処理方法がわからない場合は、Dumperここの出力を貼り付けてください

于 2013-02-26T22:56:53.440 に答える