Perl:在变量内部连接变量?

时间:2015-08-24 09:26:24

标签: perl concatenation

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

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_不存在。 那么,如何只在一行中连接两个变量?

3 个答案:

答案 0 :(得分:2)

不要尝试生成代码。

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') {
      ...
   }

   ...
}

答案 1 :(得分: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'
  }

} 

答案 2 :(得分:1)

我无法回答您的问题,因为您的问题并不清楚。我会指出 - 你的代码存在一些问题,这意味着它可能无法正常工作 - 首先解决这些问题:

  • 开启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";
}