【问题标题】:Parsing an array line by line and exploding it into more arrays逐行解析数组并将其分解为更多数组
【发布时间】:2012-10-11 16:40:59
【问题描述】:

我仍然在学习 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);
    }
}

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

谢谢

【问题讨论】:

  • 还请注意,您可能希望返回对这些数组的引用,以便以后可以将它们分开:return (\@name, \@used, \@available, \@refer, \@mount);您的返回现在将是 5 个值,每个值都包含一个数组引用。如果您不这样做,您的回报将是将所有这些数组串联成一个大列表;可能不是你的意思。见perldoc perlreftut
  • 你好乔尔,你是对的,这实际上是我想要它做的。我想将值作为数组返回,以便在以后进一步操作。谢谢!
  • 很高兴为您提供帮助!玩得开心 Perling!
  • 不要编辑问题只是为了在标题末尾添加 (Solved)

标签: arrays perl function return


【解决方案1】:

数组可能非常笨拙,从这里看起来有点尴尬。这是一个更惯用的版本,它返回以挂载名称为键的散列的 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 );

【讨论】:

  • 在这里同意——拆分然后将每个条目放入自己的数组中是一件非常麻烦的事情。它不仅需要更多的前期工作,而且还需要更多的工作来使用数据。 Roncioiu,我建议您熟悉使用 hashref 将相关数据的“记录”存储在一起;它比并行数组更容易管理。
【解决方案2】:

您的问题是您过早返回。

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

【讨论】:

  • Jozefg,你完全正确,我之前没有看到;移动返回确实解决了我的问题,现在我只需要弄清楚如何在返回的变量之间添加新行!我在粘贴的代码中省略了 use strict,但我的脚本中确实有它,而且我还在脚本开头声明了大部分变量。感谢您的帮助!
  • @user1763697 任何时候,如果您发现此答案有帮助,请单击此答案旁边的绿色复选标记,将此问题标记为已关闭
【解决方案3】:

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

【讨论】:

  • 是的,就是这样。谢谢。
猜你喜欢
  • 2015-01-09
  • 2018-05-24
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多