如何在Perl中迭代散列数组?

sdnqo3pr  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(170)

我有下面的数组:

ifNameList -> $VAR1 = [
          {
            'VALUE' => ' gpon_olt-1/1/1',
            'ASN1' => '285278465'
          },
          {
            'VALUE' => ' gpon_olt-1/1/2',
            'ASN1' => '285278466'
          },
          {
            'VALUE' => ' gpon_olt-1/1/3',
            'ASN1' => '285278467'
          },
          {
            'VALUE' => ' gpon_olt-1/1/4',
            'ASN1' => '285278468'
          },
          {
            'VALUE' => ' gpon_olt-1/1/5',
            'ASN1' => '285278469'
          },
]

我需要迭代这个哈希数组,比较每个哈希的“VALUE”字段,直到匹配并执行某个操作。
我已经做了下面的代码,但它不工作。我做错了什么?

sub GetIfIndexFromName{
    my $ifName = shift;
    my @ifList = shift;
    my $index;
    
    for (@ifList){
        my %interfaceHash = %$_;
        # Just trims any blank space on the string:
        $interfaceHash->{"VALUE"} =~ s/^\s+|\s+$//g;
        if($interfaceHash->{"VALUE"} eq $ifName){
            print "trimmed interface name-> ".$interfaceHash->{"VALUE"}."\n\n";
            $index = $interfaceHash->{"ASN1"};
        }
        
    }
    
    print "Returning index value: ".$index;
    return $index;
}
jfgube3f

jfgube3f1#

两个错误。

问题1:变量错误

始终使用use strict; use warnings;。它会发现以下错误:

# Access the `VALUE` element of the hash referenced by `$interfaceHash`.
$interfaceHash->{"VALUE"}

没有名为$interfaceHash的变量。
有三种方法可以解决此问题:
第一次
推荐使用后者,它避免了创建哈希值的副本,而创建副本需要创建大量临时标量,这些都是无用的工作。

问题2:参数检索不正确

以下是错误的:

my @ifList = shift;

shift返回一个标量。使用一个数组始终只保存一个标量是绝对没有意义的。
第一个
前一种约定效率更高,但后一种约定可以在调用者中创建更干净的代码。
我会怎么写:

use strict;
use warnings;
use feature qw( say );

use List::Util qw( first );

sub trim_inplace { $_[0] =~ s/^\s+|\s+\z//g; }

my @ifList = ...;
my $ifName = ...;

trim_inplace( $_->{ VALUE } ) for @ifList;

my $match = first { $_->{ VALUE } eq $ifName } @ifList
   or die( "Interface not found.\n" );

my $asn1 = $match->{ ASN1 };

say $asn1;

相关问题