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";
}
内部变量我想连接其他变量:
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";
}