-1

我正在编辑 perl 代码,并添加了需要向其传递哈希的子例程。

  %OrigResultHash = Parsing(\%OrigFileHash,\%OrigParamHash);

sub Parsing {

my (%fileHash,%paramHash)=(@ARG);
my %resultHash;
    foreach my $file (keys %fileHash) {
  my (@fileParam)=@{$fileHash{$file}};
  my (@fileStates)=grep(/^state:/,@fileParam);

运行时我收到错误消息:

不是 /vobs/cores/periph/blsp_prj/scripts/flow_result_parser_with_flag_orig.pl 第 193 行的 ARRAY 参考。它指的是:

foreach 我的 $file (keys %fileHash) {

你能解释一下代码中有什么问题吗?

4

2 回答 2

1

那么,@ARG 是从哪里来的?相反,您应该使用@_ 来获取传递给子程序的值。而且,我的 (%fileHash,%paramHash)=(@ARG); 是什么意思 ? Perl 使用哈希引用而不是哈希体来传递给函数,所以,你不能使用 %fileHash ,而只是一个标量值来存储哈希引用。所以,将你的代码更改为:

%OrigResultHash = Parsing(\%OrigFileHash,\%OrigParamHash);

sub Parsing {

my ($fileHash,$paramHash)=@_;
my %resultHash;
    foreach my $file (keys %$fileHash) {
    my (@fileParam)=$fileHash->{$file};
    .....
于 2013-09-29T08:29:03.003 回答
1

你的代码有很多问题。首先,请打开use strictuse warnings

  • 您将两个参数\%OrigFileHash,\%OrigParamHash作为引用传递,这是正确的做法,因为它们是哈希值。但是在您的子程序中,您将它们分配给带有my (%fileHash,%paramHash)=(@ARG).

    这样,您最终会得到 in%fileHashundefin的一键哈希%paramHash

    print Dumper \%fileHash, %paramHash;
    
    $VAR1 = {
      'HASH(0x5cad8c)' => {
        'xxx' => 'asdf'
      }
    };
    

    如您所见,这不是您想要的。

  • 但是,您所说的实际错误消息不是来自该foreach行。它来自您拥有的下方的行my (@fileParam)=@{$fileHash{$file}}。正如我们在上面的Dumper输出中看到的,正如错误消息所说,没有数组 ref。一旦我们解决了分配问题,这将消失。您需要将引用的参数分配为标量,以便仍然是引用。如果您更喜欢使用散列,则可以取消引用它们。我将其合并为以下几行。

    my %fileHash = %{ shift };
    my %paramHash = %{ shift };
    
于 2013-09-29T08:16:00.867 回答