Perl eval 获取单元素数组



>我正在尝试弄清楚如何使用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"
          ];

我想我得到了最后 2 个打印输出的标量参考,但我想要一个包含以下单个元素的数组:

$VAR1 = [
            "192.168.1.100"
          ];

eval "[192.168.1.100]"是数组引用,而不是标量引用。数组引用包含一个元素,但它不是您可能期望的字符串"192.168.1.100",因为192.168.1.100没有引号。相反,您正在创建版本字符串192.168.1.100

解决方法是在输入中包含引号或引号运算符。

my $ip_array = "['192.168.1.100']";
my $ip_array2 = "[qq/192.168.1.100/,]";

请参阅 perldata 中的"版本字符串"。

你说你想要

[ "192.168.1.100" ]

但是你传递给Perl的代码是

[ 192.168.1.100 ]

这些是非常不同的。

  • "192.168.1.100"创建 13 个字符的字符串192.168.1.100

  • 192.168.1.100v192.168.1.100 的缩写,它创建与 chr(192).chr(168).chr(1).chr(100) 相同的 4 个字符的字符串。

编写所需内容的多种方法之一:

my $ip_array = '["192.168.1.100"]';

最新更新