我试图弄清楚如何使用perl的eval来获取单个元素数组。到目前为止,我有:
use strict;
use warnings;
use Data::Dumper;
sub printit
{
my $param = shift;
my $thing = eval $param;
if (ref($thing) =~ /HASH/ || ref($thing) =~ /ARRAY/) {
print Dumper \$thing;
} else {
print $param . "\n";
}
}
my $ip = "192.168.1.100";
my $ip_array = "[192.168.1.100]";
my $ip_array2 = "[192.168.1.100,]";
my $string = "{ a => 1, b => 2, c => 3}";
my $another_string = "[1, 2, 3 ]";
printit($ip);
printit($string);
printit($another_string);
printit($ip_array);
printit($ip_array2);
我的输出如下:
[user]$ perl ~/tmp/cast.pl
192.168.1.100
$VAR1 = \{
'c' => 3,
'a' => 1,
'b' => 2
};
$VAR1 = \[
1,
2,
3
];
$VAR1 = \[
"\x{c0}\x{a8}d"
];
$VAR1 = \[
"\x{c0}\x{a8}d"
];
我想我在最后两次打印输出时得到了一个标量参考,但我想要一个包含这样一个元素的数组:
$VAR1 = \[
"192.168.1.100"
];
答案 0 :(得分:5)
eval "[192.168.1.100]"
是数组引用,而不是标量引用。数组引用包含一个元素,但它不是您所期望的字符串"192.168.1.100"
,因为192.168.1.100
未引用。而是创建store options 192.168.1.100
。
修复方法是在输入中包含引号或引号操作符。
my $ip_array = "['192.168.1.100']";
my $ip_array2 = "[qq/192.168.1.100/,]";
参见" Version Strings"在version string。
答案 1 :(得分:1)
你说你想要
[ "192.168.1.100" ]
但是传递给Perl的代码是
[ 192.168.1.100 ]
那些是非常不同的。
"192.168.1.100"
创建13个字符的字符串192.168.1.100
。
192.168.1.100
是v192.168.1.100
的缩写,它会创建与chr(192).chr(168).chr(1).chr(100)
相同的4个字符的字符串。
写下你想要的许多方法之一:
my $ip_array = '["192.168.1.100"]';