Diamond运算符如何使用数组作为参数

问题描述

我有一个数组@address,其零元素包含一些字符串。 我找不到使用@array作为参数的示例Diamond运算符。 (如何“拆分”字符串?)

use Mojo::Loader qw/ data_section /;

my @address =  data_section 'main','address_strings';


while( my $line = <@address> ) {
  print $line;
}


1;


__DATA__
@@ address_strings
"010101,УУУ обл.,м. Тернопіль,вул. ВВВ,буд. 0101,01"
"020202,ЛЛЛ обл.,ААА район,село ФФФ,ВУЛИЦЯ ШШШ,будинок 01"
"030303,м.ЮЮЮ,ЮЮЮ р-н,вул. ЛЛЛ,буд.01,офіс 01"

UPD
从doc <>运算符读取允许GLOB或文件句柄,但在我的情况下,这是一个字符串数组

my @arr = <<TEXT;
many
lines
TEXT

while( my $line =  <@arr> ) {
    print ">>$line<<\n";
}

在这种情况下,<>做一些魔术吗?您会注意到,行被分割了

解决方法

那不是钻石操作员所做的,这就是为什么您找不到任何示例的原因。

您只需要:

foreach my $line ( @address ) { 
  print $line;
}

<>表示从文件句柄读取,而@address不是文件句柄。它甚至不是一个文件句柄数组。

理论上您可以做到

while ( my $line = <DATA> ) { 
   print $line; 
}

由于DATA是文件句柄,因此<>触发从该文件句柄读取的一条记录。 (记录边界默认为换行,但是您可以更改$/

鉴于您对Mojo所做的事情,这没有任何意义,我仅以它为例应该如何工作。

,

<>可能是两个不同的运算符,globreadline。如果其中是简单的标量变量或裸字,则为readline操作,参数为要使用的文件句柄。否则,这是一个全局操作,该参数被视为由空格分隔的文件名(或文件名通配符以进行扩展)。

<>是全局操作时,将其视为双引号上下文,并通过与$"联接(默认为空格)对数组进行插值。因此<@x>glob "@x"glob join $",@x。因此,假设$"不变且@x的元素中没有通配符,则非常类似于split ' ',"@x",将所有元素与空格连接在一起,然后将结果分割为空白

,

看看perldoc -f glob

典型用法是:

my @suffix = qw(*.yaml *.json);
my @yaml = <@suffix>;
# or directly
my @yamlfiles = <*.yaml *.json>;

因此在将其用于可能是文件名通配符的数据时要小心;-)