7

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

我有一个名为$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()函数返回类型名称和十六进制数字吗?

4

3 回答 3

10

user1937198很好地解释了如何做,但是为什么它会这样工作呢?

这很简单:

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

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

join("\n",$zones)

您本质上是在调用join单元素列表。并且元素是一个引用,它恰好被字符串化为ARRAY(0x170cf0d8).

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

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

当您拥有嵌套结构时,这一点很重要,因为虽然您可以将普通数组作为变量,但当您处理嵌套数据结构时,它始终是引用。

于 2013-06-15T21:36:47.500 回答
6

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

于 2013-06-15T21:30:40.693 回答
5

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

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

有关更多信息,有关于参考的简短教程:http: //perldoc.perl.org/perlreftut.html#NAME

于 2013-06-15T21:35:26.023 回答