4

我仍然在学习 Perl,并且知道我还有很长的路要走,我一直在阅读 O'Reilly 的 Perl 书籍,还参加了一些关于 Udemy 的课程,甚至还完成了关于 Perl 的 Lynda 课程。

我正在尝试编写一个备份程序来满足我的需求,但我似乎很难使用我的一个功能。

sub list {
    my @zfs_temp = `zfs list`;
    foreach (@zfs_temp) {
    my ($name, $used, $available, $refer, $mount) = split(/\s+/);
    push(@name, $name);
    push(@used, $used);
    push(@available, $available);
    push(@refer, $refer);
    push(@mount, $mount);
#    print "@name, @used, @available, @refer, @mount\n";
    return (@name, @used, @available, @refer, @mount);
    }
}

似乎我只回了一条线,我真的不确定我做错了什么,有人能指出我正确的方向吗?

谢谢你

4

3 回答 3

5

您的问题是您过早返回。

sub list {
    my @zfs_temp = `zfs list`;
    my (@name, @used, @available, @refer, @mount); #declared ahead of time and scoped appropriately 
    foreach (@zfs_temp) {
        my ($name, $used, $available, $refer, $mount) = split(/\s+/);
        push(@name, $name);
        push(@used, $used);
        push(@available, $available);
        push(@refer, $refer);
        push(@mount, $mount);
    }
    return (@name, @used, @available, @refer, @mount); #note how it's outside the loop now

 }

否则,您只需在循环一次后返回,可能不是您想要的。

此外,您应该使用my. 否则 Perl 会抱怨use strict你应该始终使用它。

欢迎使用 Perl!

编辑:

正如 Joel 所指出的,您可能希望返回对这些数组的引用。这很容易做到,只需使用:

return (\@name, \@used, \@available, \@refer, \@mount);

如果您对此感到困惑,请查看perlref 。

于 2012-10-21T20:27:17.897 回答
3

您将在一次迭代后返回。将 return 放在循环之外。

于 2012-10-21T20:30:01.720 回答
2

数组可能非常笨拙,从这里看起来有点尴尬。这是一个更惯用的版本,它返回以挂载名称为键的散列的 hashref(并假设它们是唯一的)。我不必zfs测试,所以这是未经测试的,但它应该是正确的,并且Dumper电话应该清楚地说明发生了什么。

use strict;
use warnings;
use Data::Dumper;
$Data::Dumper::Terse = 1;

print Dumper( list() );

sub list {
    my %info;
    for ( qx { zfs list } )
    {
        my ( $name, $used, $available, $refer, $mount ) = split;
        $info{$name} = {
            used => $used,
            available => $available,
            refer => $refer,
            mount => $mount,
        };
    }
    \%info;
}

如果你仍然要使用数组,这个语法会让返回变得不那么尴尬——

return \( @name, @used, @available, @refer, @mount );
于 2012-10-23T13:46:38.997 回答