Perl:在变量内连接变量?

Perl: concatenate variable inside variable?

内部变量我想连接其他变量:

my %hash = (
 DNS_AD_toto => ['10.0.0.1'],
 DNS_OP_toto => ['192.168.0.2', '10.0.0.2'],
 DNS_ZA_toto => ['192.168.0.3'],
);

foreach my $abc ("AD", "OP"){
  print $DNS_${abc}_toto[0];
} 

但是 print $DNS_$a_toto[0] 不起作用,因为 $DNS_ 不存在。 那么,如何在一行中连接两个变量?

不要尝试生成代码。

my %DNS_toto = (
    AD => [ '10.0.0.1', '10.0.0.2' ],
    OP => [ '192.168.0.1', '192.168.0.2' ],
);

for my $foo (qw( AD OP )) {
   if ($DNS_toto{$foo}[0] eq '192.168.0.2') {
      ...
   }

   ...
}

当你想操作变量名时使用散列,

use strict;
use warnings;

my %hash = (
  DNS_AD_toto => ['10.0.0.1', '10.0.0.2'],
  DNS_OP_toto => ['192.168.0.1', '192.168.0.2'],
);

foreach my $s ("AD", "OP") {
  my $key = "DNS_${s}_toto";

  if( $hash{$key}[0] eq "192.168.0.2") {
    print 'It is AD'
  } 
  if( $hash{$key}[0] eq "10.0.0.2") {
    print 'It is OP'
  }

} 

我无法回答你的问题,因为我不清楚你的问题是什么。不过我要指出 - 您的代码有几个问题,这意味着它可能无法正常工作 - 首先解决这些问题:

  • 开启 use strict;use warnings;。修复生成的任何错误 - 这些应该是您编写的所有内容的前两行。
  • my @DNS_AD_toto = {'10.0.0.1', '10.0.0.2'}; 可能并没有按照您的想法行事。

{} 表示匿名散列。所以你在这里创建的是一个匿名散列,然后将它插入到一个数组中。您的数组是一个元素长,并包含一个键值对。这几乎肯定不是你想要的。

例如:

$VAR1 = [
          {
            '10.0.0.1' => '10.0.0.2'
          }
        ];
  • 如评论中所述 - 不要使用 $a - 它是 sort 的保留变量。事实上 - 不要使用任何单字母变量名。很少有充分的理由。

  • 你在谈论符号引用 - 那些很讨厌。不。请改用哈希。有关更多详细信息,请参见此处:http://perl.plover.com/varvarname.html

可能想要的是:

my %DNS_toto = (
   'AD' => [ '10.0.0.1', '10.0.0.2' ],
   'OP' => [ '192.168.0.1', '192.168.0.2' ],
);
print Dumper \%DNS_toto;

给出:

$VAR1 = {
          'AD' => [
                    '10.0.0.1',
                    '10.0.0.2'
                  ],
          'OP' => [
                    '192.168.0.1',
                    '192.168.0.2'
                  ]
        };

(但我仍然不太清楚你想要的最终结果是什么 - 更新你的问题,我会更新这个答案)。

编辑:以下问题更新:

#!/usr/bin/env perl
use strict;
use warnings;

my %hash = (
    DNS_AD_toto => ['10.0.0.1'],
    DNS_OP_toto => [ '192.168.0.2', '10.0.0.2' ],
    DNS_ZA_toto => ['192.168.0.3'],
);

foreach my $abc ( "AD", "OP" ) {
    print $hash{ "DNS_" . $abc . "_toto" }[0], "\n";
}

或者:

foreach my $key ( "DNS_AD_toto", "DNS_OP_toto" ) {
    print $hash{$key},"\n";
}

或者:

foreach my $abc ( grep {m/(AD|OP)/} keys %hash ) {
    print $hash{$abc}[0], "\n";
}