这个问题是关于要求对Perl系统中发生的事情做出一些解释,因为我不明白这一点,尽管我已经编码了25年多了。所以故事来了..。
在尝试在Perl5中使用Perl5实例时,我尝试获取并打印配额列表,结果返回了一些奇怪的结构数据。
my %quotas = $client->listquota(@list[0]);
if ( $client->error ) {
printf STDERR "Error: " . $client->error . "\n";
exit 1;
}
print "root: " . $list[0] . "\n";
foreach my $quota ( keys %quotas ) {
print( $quota, " ", $quotas{$quota}[0], "/", $quotas{$quota}[1], " KiB\n" );
}这段代码实际上是按需要打印出来的,例如
root: user.myuser
STORAGE: 123/4567 KiB此代码摘自Cyrus::IMAP::Shell阅读,类似于以下内容:
my %quota = $$cyrref->listquota(@nargv);
foreach my $quota (keys %quota) {
$lfh->[1]->print(" ", $quota, " ", $quota{$quota}[0], "/", $quota{$quota}[1]);
if ($quota{$quota}[1]) {
$lfh->[1]->print(" (", $quota{$quota}[0] * 100 / $quota{$quota}[1], "%)");
}
}在我看来,这段代码使用$quota{$quota}[0]有点傻。在我的例子中,我将变量重命名了一些,以拒绝使用不同类型但具有等效名称的变量的混合使用。
在从Cyrus::IMAP::Admin获取代码之前,我试图理解它的规范,并通过自己编写的代码来处理结果。看起来是这样的:
my %quotas = $client->listquota(@list[0]);
if ( $client->error ) {
printf STDERR "Error: " . $client->error . "\n";
exit 1;
}
print "root: " . $list[0] . "\n";
foreach my $quota ( keys %quotas ) {
my @sizes = @quotas{$quota};
print( $quota, " ", $sizes[0], "/", $sizes[1], "\n" );
}然而,这段代码不起作用,我自己也找不到任何合理的解释。我在这里的理解是,将最后一个代码示例转移到最初发布的表单需要将第11行中的赋值源替换为第12行中的用法,并将配额的信号从@更改为$,因为我正试图最终获得一个标量结果。这最后一段代码是在斜杠之前打印数组引用,之后没有输出。所以我必须像这样修正我的代码才能让它起作用:
my %quotas = $client->listquota(@list[0]);
if ( $client->error ) {
printf STDERR "Error: " . $client->error . "\n";
exit 1;
}
print "root: " . $list[0] . "\n";
foreach my $quota ( keys %quotas ) {
my @sizes = @quotas{$quota};
print( $quota, " ", $sizes[0][0], "/", $sizes[0][1], "\n" );
}第12行中的附加取消引用是我现在感到困惑的地方。为什么@sizes 包含一个在其唯一的第一个元素中存储另一个数组的数组?由于困惑,我已经尝试了第11行中的替代代码,但没有结果。这些测试包括
my @sizes = $quotas{$quota};(与上面张贴的原始代码相当)和
my $sizes = @quotas{$quota};(因为我不知道为什么)。在这里,交换符号似乎根本不会改变赋值的语义。但是使用这个赋值似乎打开了最初包含在%quotas中的数据结构的不同视图。在最上面的代码片段中使用@sizes $quotas{$quota} 的匹配内容和结构需要什么样的西格码?
发布于 2014-01-10 18:28:56
我相信你想把这个写在你的第11行:
my @sizes = @{ $quotas{$quota} };
此外,建议您开始使用任何地方的数据::Dumper。
例如。
use Data::Dumper;
print 'Data structure of \%quotas: ' . Dumper(\%quotas) . qq(\n);
这样你就可以确定你正在处理的是什么结构。
https://stackoverflow.com/questions/21051294
复制相似问题