首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不一致(愚蠢?)Perl 5中的数据访问(也使我对西格尔斯的使用感到困惑)

不一致(愚蠢?)Perl 5中的数据访问(也使我对西格尔斯的使用感到困惑)
EN

Stack Overflow用户
提问于 2014-01-10 18:04:47
回答 1查看 115关注 0票数 1

这个问题是关于要求对Perl系统中发生的事情做出一些解释,因为我不明白这一点,尽管我已经编码了25年多了。所以故事来了..。

在尝试在Perl5中使用Perl5实例时,我尝试获取并打印配额列表,结果返回了一些奇怪的结构数据。

代码语言:javascript
复制
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" );
}

这段代码实际上是按需要打印出来的,例如

代码语言:javascript
复制
root: user.myuser
STORAGE: 123/4567 KiB

此代码摘自Cyrus::IMAP::Shell阅读,类似于以下内容:

代码语言:javascript
复制
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获取代码之前,我试图理解它的规范,并通过自己编写的代码来处理结果。看起来是这样的:

代码语言:javascript
复制
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行中的用法,并将配额的信号从@更改为$,因为我正试图最终获得一个标量结果。这最后一段代码是在斜杠之前打印数组引用,之后没有输出。所以我必须像这样修正我的代码才能让它起作用:

代码语言:javascript
复制
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行中的替代代码,但没有结果。这些测试包括

代码语言:javascript
复制
    my @sizes = $quotas{$quota};

(与上面张贴的原始代码相当)和

代码语言:javascript
复制
    my $sizes = @quotas{$quota};

(因为我不知道为什么)。在这里,交换符号似乎根本不会改变赋值的语义。但是使用这个赋值似乎打开了最初包含在%quotas中的数据结构的不同视图。在最上面的代码片段中使用@sizes $quotas{$quota} 的匹配内容和结构需要什么样的西格码?

EN

回答 1

Stack Overflow用户

发布于 2014-01-10 18:28:56

我相信你想把这个写在你的第11行:

my @sizes = @{ $quotas{$quota} };

此外,建议您开始使用任何地方的数据::Dumper。

例如。

use Data::Dumper;

print 'Data structure of \%quotas: ' . Dumper(\%quotas) . qq(\n);

这样你就可以确定你正在处理的是什么结构。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21051294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档