为什么在尝试使用Perl的Archive :: Extract解压缩时会得到ARRAY(0x7fd5c22f7cd8)的文件名?

时间:2013-02-26 22:52:31

标签: perl unzip

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

3 个答案:

答案 0 :(得分:6)

$ae->files返回数组引用,而不是数组。试试这个:

my $files = $ae->files;

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

答案 1 :(得分:1)

来自Archive::Extract的Perldoc:

  

$ AE->文件

     

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

方法返回非数组和散列,但引用它们是很常见的。对于将数组和散列引用作为参数的方法,这种方法也很常见。这是因为在方法和通话之间来回传递的数据较少。

你可以这样做:

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

@{...} 取消引用引用并将其转换为简单数组。是的,您可以像{I}一样放置在@{...}中返回数组引用的方法调用。

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

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

答案 2 :(得分:0)

尝试这样做:

use Data::Dumper;
print Dumper @files;

这样,您将看到@files的内容。

如果您不知道如何处理数据结构,请将Dumper的输出粘贴到此处