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