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)”。我知道存档中有很多文件,所以我很好奇我在这里做错了什么。-戴夫

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->文件

这是一个数组 ref,包含存档中的所有路径。有关详细信息,请参阅 extract()。

方法返回的不是数组和散列而是对它们的引用是很常见的。将数组和散列的引用作为参数的方法也很常见。这是因为在方法和调用之间来回传递的数据更少。

你可以这样做:

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

@{...} 取消引用引用并使其成为一个简单的数组。@{...}是的,您可以像我一样放置返回数组引用的方法调用。

如前所述,一个非常有用的包是Data::Dumper。这可以作为参考并向您展示其中包含的数据结构。它还会告诉您该数据结构是否代表一个受祝福的对象,这可能是一个线索,表明您可以使用一种方法来提取数据。

例如,想象一个名为Company的对象。Employee 其中一种方法可能是 $company->Employees ,它返回对objects的数组引用。你可能没有意识到这一点并发现你得到了类似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 回答