内部变量我想连接其他变量:
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_
不存在。
那么,如何只在一行中连接两个变量?
答案 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";
}