问题描述
我有一个数组@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所做的事情,这没有任何意义,我仅以它为例应该如何工作。
, <>
可能是两个不同的运算符,glob
或readline
。如果其中是简单的标量变量或裸字,则为readline操作,参数为要使用的文件句柄。否则,这是一个全局操作,该参数被视为由空格分隔的文件名(或文件名通配符以进行扩展)。
当<>
是全局操作时,将其视为双引号上下文,并通过与$"
联接(默认为空格)对数组进行插值。因此<@x>
是glob "@x"
是glob join $",@x
。因此,假设$"
不变且@x
的元素中没有通配符,则非常类似于split ' ',"@x"
,将所有元素与空格连接在一起,然后将结果分割为空白
典型用法是:
my @suffix = qw(*.yaml *.json);
my @yaml = <@suffix>;
# or directly
my @yamlfiles = <*.yaml *.json>;
因此在将其用于可能是文件名通配符的数据时要小心;-)