我仍然在赚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);
}
}
似乎我只回到了一条线,我真的不确定我做错了什么,有人能指出我正确的方向吗?
谢谢
答案 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 );