join()函数返回的是类型后跟十六进制数而不是连接字符串

时间:2013-06-15 21:28:31

标签: perl

本质上,我想获取一个数组并创建一个单独的字符串,其中所述数组的元素用换行符分隔。

我有一个名为$zones的数组。输出$zones的引用确认它是一个数组。

以下代码:

print_log(Dumper($zones));
print_log('-------');
print_log(Dumper(join("\n",$zones)));

产生以下输出

  [2013-06-15 16:23:29 -0500] info [dnsadmin] $VAR1 = [
          'fake.com25',
          'fake.com2',
          'fake.com27',
          'fake.com43',
          'fake.com41',
          'fake.com40',
          'fake.com39',
          'fake.com37',
          'fake.com36',
          'fake.com35',
          'fake.com31',
          'fake.com56',
          'fake.com55',
          'fake.com54',
          'fake.com53',
          'fake.com52',
          'fake.com51',
          'fake.com50',
          'fake.com49',
          'fake.com48',
          'fake.com42',
          'fake.com38',
          'fake.com34',
          'fake.com33',
          'fake.com32',
          'fake.com30',
          'fake.com29',
          'fake.com28',
          'fake.com26',
          'fake.com24',
          'fake.com23',
          'fake.com69',
          'fake.com68',
          'fake.com67',
          'fake.com66',
          '0',
          'fake.com44',
          'fake.com45',
          'fake.com46',
          'fake.com278'
        ];

[2013-06-15 16:23:29 -0500] info [dnsadmin] -------
[2013-06-15 16:23:29 -0500] info [dnsadmin] $VAR1 = 'ARRAY(0x170cf0d8)';

我真的不想手动循环遍历此数组。有人可以解释为什么join()函数返回类型的名称和十六进制数字吗?

3 个答案:

答案 0 :(得分:10)

用户1937198很好地解释了怎么做,但为什么会这样呢?

很简单:

$zones不是数组。这是一个数组引用。

join适用于列表。所以如果你这样做:

join("\n",$zones)

您基本上是在单个元素列表上调用join。元素是一个引用,恰好串联到ARRAY(0x170cf0d8)

为了使其正常工作,您必须取消引用它,并通过使用实数数据类型前缀(@%,或在某些情况下$)来完成。

这可以这样写:@$zones,或者(包括我在内的一些,说它更具可读性):@{ $zones }

当你使用嵌套结构时,这很重要,因为虽然你可以将普通数组作为变量,但是当你处理嵌套数据结构时,它总是引用。

答案 1 :(得分:6)

你想要的是join("\n",@{$zones}))

答案 2 :(得分:5)

$zones是数组引用,要加入数组值,首先必须通过在标量$zones前加@

来取消引用它
print_log(Dumper(join("\n",@$zones)));

有关更多信息,请参阅以下简短教程: http://perldoc.perl.org/perlreftut.html#NAME