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;

不要忘记也修复 fetcher:

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

但是你为什么要用一个键创建一大堆哈希?!您是否打算这样做:

%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 更改,并通过创建哈希而不是引用来修复无用的引用。它没有解决ikegami提到的关于创建多个单键哈希的设计问题。

于 2012-11-09T02:32:16.837 回答