逐行解析数组并将其爆炸成更多数组

时间:2012-10-21 20:21:51

标签: arrays perl function return

我仍然在赚Perl,并知道我还有很长的路要走,我一直在读O' Reilly的Perl书籍,还在Udemy上课,甚至还参加了Lynda课程在Perl上。

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

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);
    }
}

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

谢谢

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

您在一次迭代后返回。将回车放在回路外面。

答案 2 :(得分: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 );