我的代码如下:
my @street = qw(
examplestreet
example street
);
foreach my $str (@street) {
print "$str\n";
}
输出显然是
examplestreet
example
street
但我希望它是
examplestreet
example street
问题:我是否可以修改qw()
的行为,以便它只用换行符分隔,而不是用空格分隔?
PS:
为什么我这样做:获得了大量条目,并且将它们逐行复制粘贴到代码中是最简单的。它只是一个小小的剪辑,不值得任何努力。如果我找不到解决方案,我会为数据制作单独的文件并将其读入脚本。但捷径会很棒!
(或者我应该尝试使用__DATA__
吗?不知道如何实现这一目标......)当前的Perl是v5.20.1
答案 0 :(得分:10)
您无法更改qw
的行为,但您可以改用HERE文档:
my @streets = split /\n/, << '__LINES__';
examplestreet
example street
__LINES__
print "<$_>\n" for @streets;
HERE文档始终是一个字符串,因此您必须在换行符上split。
也可以使用DATA,但前提是只需要一个这样的部分(并且您不想使用Data::Section):
my @streets = <DATA>;
chomp @streets; # This time, we have to remove the newlines from the strings.
print "<$_>\n" for @streets;
__DATA__
examplestreet
example street
答案 1 :(得分:3)
您还可以从字符串逐行阅读:
#!/usr/bin/env perl
use strict;
use warnings;
my $streets = <<EO_STREETS;
examplestreet
example street
EO_STREETS
open my $in, '<', \$streets
or die "Cannot read from string buffer";
while (my $street = <$in>) {
$street =~ s/\s+\z//; # just in case
print "Street: '$street'\n";
}
close $in;
与split
heredoc相比,这确实有减少脚本内存占用的优势。