Perl qw中的保白空间
有没有办法在qw中保留一些空白?例如:Perl qw中的保白空间,perl,Perl,有没有办法在qw中保留一些空白?例如: my @a=qw(1234 John Smith 123 Main St.); 将生成包含6个元素的数组。有没有办法,哦,我不知道。。。逃离空白区,保留一部分?比如: my @a=qw(1234 John\ Smith 123\ Main\ St.); 要返回3个元素:“1234”、“John Smith”、“123 Main St.” (仅供参考,我尝试了上述方法,也尝试了不同的引号组合,但均无效)如果您有大量此类记录,请从文本文件中读取它们,然后使
my @a=qw(1234 John Smith 123 Main St.);
将生成包含6个元素的数组。有没有办法,哦,我不知道。。。逃离空白区,保留一部分?比如:
my @a=qw(1234 John\ Smith 123\ Main\ St.);
要返回3个元素:“1234”、“John Smith”、“123 Main St.”
(仅供参考,我尝试了上述方法,也尝试了不同的引号组合,但均无效)如果您有大量此类记录,请从文本文件中读取它们,然后使用
split()
获取记录的各个元素。如果您的输入文本文件没有合适的列分隔符,那么您最好以某种方式修复输入文件(例如,通过修改最初生成该文件的程序)。如果使用\uuuuuuuuuuuuuuuuuuuuu
,仍然需要正确使用列分隔符。我建议您使用制表符作为列分隔符,但您确定数据中不存在的任何字符都可以。不,您不能使用qw
保留空白。正如mpapec在评论中提到的,qw
用于引用单词。以下是一些备选方案:
简单数组
埃雷多克+斯普利特
myscript
myscript
使用Text::CSV;
我的$csv=Text::csv->new()或die Text::csv->error_diag();
打开my$fh,“以换行符分隔:
my @a = split /\n/, <<'END';
1234
John Smith
123 Main St.
END
my@a=split/\n/,有多种方法。我最喜欢的是选择一个特定的转义序列来替换空格。例如\u
:
my @a = qw(A_B C);
y/_/ / for @a;
或者更精细的序列,如\u SPACE\u
:
my @a = qw(A_SPACE_B C);
s/_SPACE_/ /g for @a;
qw
=>引用单词而不是空格。你可以my@a=split/-/,q(1234 John Smith-123-Main St.);
为什么不使用简单数组?my@a=('1234','John Smith','123 Main St.);
只需将IFS更改为不包含“空格”的内容,并相应地更改脚本的其余部分即可[当IFS不同时,行上的许多处理方式会有所不同]。您可以“还原”原始IFS[但在更改之前,您需要将其保存在另一个变量中,然后从该另一个变量还原]一旦你不再需要它不同了。@foibs,这是一个过于简单的例子。我真的会使用一个qw,它有几十个条目,由换行符分隔,等等。重复这样做,将意味着大量键入引号、逗号和其他标点符号。所以像纯标量字符串一样存储它,并用换行符分割。如果S是bash variab在Perl中没有直接等价物(请参见中的$/
和$\
)。请不要在回答中对其他用户发表评论(这就是评论的目的)。
use Inline::Files;
my @a = <FOO>;
chomp @a;
my @b = <BAR>;
chomp @b;
__FOO__
1234
John Smith
123 Main St.
__BAR__
5678
Jane Doe
456 Anonymous Ln.
1234
John Smith
123 Main St.
open my $fh, "<", "data.txt" or die $!;
my @a = <$fh>;
chomp @a;
close $fh;
1234,"John Smith","123 Main St."
5678,"Jane Doe","456 Anonymous Ln."
use Text::CSV;
my $csv = Text::CSV->new() or die Text::CSV->error_diag();
open my $fh, "<", "data.csv" or die $!;
while (my $row = $csv->getline($fh)) {
# $row is an arrayref
}
$csv->eof or $csv->error_diag();
close $fh;
my @a = split /\n/, <<'END';
1234
John Smith
123 Main St.
END
my @a = qw(A_B C);
y/_/ / for @a;
my @a = qw(A_SPACE_B C);
s/_SPACE_/ /g for @a;