4

私はまだPerlを稼いでおり、かなりの道のりがあることを知っています。O'ReillyのPerlの本を読んだり、Udemyでいくつかのクラスを受講したり、PerlのLyndaコースを受講したりしています。

必要なものをスクラッチするためのバックアッププログラムを作成しようとしていますが、自分の機能の1つで非常に苦労しているようです。

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

私は1行しか戻っていないようですが、何が間違っているのかよくわかりません。誰かが私を正しい方向に向けることができますか?

ありがとうございました

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

 }

そうしないと、ループを1回通過した後に単に戻るだけで、おそらくあなたが望むものではありません.

さらに、これらの配列はmy. use strictそうしないと、Perl は常に使用すべきであると文句を言います。

パールへようこそ!

編集:

Joel が指摘したように、おそらくこれらの配列への参照を返したいと思うでしょう。使い方はとても簡単です:

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

それについて混乱している場合は、perlrefを調べてください。

于 2012-10-21T20:27:17.897 に答える
3

1回の反復後に戻ってきます。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 に答える