【问题标题】:perl eval to get single element arrayperl eval 获取单元素数组
【发布时间】:2015-04-30 15:24:13
【问题描述】:

我试图弄清楚如何使用 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 次打印输出的标量 ref,但我想要一个包含单个元素的数组,如下所示:

$VAR1 = \[
            "192.168.1.100"
          ];

【问题讨论】:

  • 你确定这就是你得到的吗?我刚刚尝试运行您的代码,并获得了所需的输出...
  • @Sobrique:你运行什么 Perl 版本?
  • Activeperl 5.20.1 - 猜测我们可能会在这里进行引用插值。是否:my $ip_array = "['192.168.1.100']"; 显示相同的问题?
  • print Dumper \$thing; 应该是 print Dumper $thing;。如果要转储不是标量的变量,请使用 \

标签: arrays perl


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢@choroba 的编辑——我找不到文档
  • 你知道这是否是特定的版本吗?因为如上所述 - OP 代码在我的 5.20.2 perl 上运行正常。 (虽然被授予,但可能由于数据类型而产生其他意想不到的后果)
  • @Sobrique,再看一遍。您得到的是 [ 192.168.1.100 ] 而不是所需的 [ "192.168.1.100" ]
  • 是的。所以这可能是相同的结果,但处理输出要好一些。
  • [user]$ perl -v 这是为 x86_64-linux-thread-multi 构建的 perl,v5.10.0
【解决方案2】:

你说你想要

[ "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"]';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多