0

私は次のperlコードを持っています:

@searchInfo = ();

sub main()
{
    processCmdLine();

    foreach my $info ( @searchInfo )
    {
        print "Search field: " . $info{field} . "\n";
        print "Search value: " . $info{value} . "\n";
    }
}

sub processCmdLine()
{
    while(@ARGV > 1)
    {
        $rec = {};
        $rec{field} = shift(@ARGV);
        $rec{value} = shift(@ARGV);
        print "$info{field} = $info{value}\n";
        push @searchInfo, $rec;
    }
}

次のようなコマンドでこれを実行するとscript.pl f1 v1 f2 v2、次の出力が得られます。

f1 = v1
f2 = v2
Search field:
Search value:
Search field:
Search value:

このチュートリアルに基づいてコードを作成しています。

配列内のハッシュの値が空である理由は何ですか?

4

2 に答える 2

1

常に使用してuse strict; use warnings;ください!!! %infoandという名前のハッシュにアクセスしていることがわかりますが%rec、そのような変数はありません。

ハッシュ値はスカラーです。そのため、ハッシュを含めることはできません。これは、ハッシュへの参照を使用して概算できます。を使用してこれを実現しているように見え$rec = {};ますが、その変数を再度使用することはありません。

修理:

my $rec = {};
$rec->{field} = shift(@ARGV);
$rec->{value} = shift(@ARGV);
push @searchInfo, $rec;

よりクリーンな修正:

my %rec;
$rec{field} = shift(@ARGV);
$rec{value} = shift(@ARGV);
push @searchInfo, \%rec;

フェッチャーも修正することを忘れないでください:

print "Search field: $info->{field}\n";
print "Search value: $info->{value}\n";

しかし、なぜ1つのキーで大量のハッシュを作成するのですか?!あなたはおそらくするつもりでしたか:

%search_info = @ARGV;

次に、フェッチャーは

for my $key (keys(%search_info)) {
    my $val = $search_info{$key};
    print "Search field: $key\n";
    print "Search value: $val\n";
}
于 2012-11-09T00:24:58.423 に答える
0

サブルーチン内で@ARGVを使用しないでください。代わりに@_を使用し、@ARGVをパラメーターとして使用してサブルーチンを呼び出します。このように、後で別の配列をサブルーチンに渡したい場合は、定義をハードコーディングしたすべての場所を探すのではなく、元の呼び出しを変更するだけで済みます。これにより、あなたやあなたのコードに接触する他の人のデバッグ時間を節約できます。これにより、コマンドラインでargsと入力してテストするのではなく、テストのためにサブルーチンで多数の異なる値を持つ配列をトスすることもできます。

    sub processCmdLine() {
        while(@ARGV > 1) {    
            $rec = {};
            $rec{field} = shift(@ARGV);
            $rec{value} = shift(@ARGV);j
            print "$info{field} = $info{value}\n";
            push @searchInfo, $rec;
        }
    }

になります:

    sub processCmdLine() {
        while(@_ > 1) {
            my %rec;
            ($rec{field}, $rec{value}) = @_;
            print "$info{field} = $info{value}\n";
            push @searchInfo, $rec;
        }
    }
    processCmdLine(@ARGV);

注:この例では、@ ARGVの推奨される変更のみを示しており、参照の代わりにハッシュを作成することで、役に立たない参照を修正しています。複数の単一キーハッシュの作成に関して池上が言及している設計上の問題は修正されません。

于 2012-11-09T02:32:16.837 に答える