【发布时间】:2014-09-18 02:29:31
【问题描述】:
这是我的 perl 5.16 代码
while(<>) {
chomp;
@data = split /a/, $_;
print(join("b",@data),"\n");
}
如果我输入一个包含这个的文件:
paaaa
paaaaq
我明白了
p
pbbbbq
但我期待
pbbbb
pbbbbq
为什么我期望后一种行为是错误的?
【问题讨论】:
这是我的 perl 5.16 代码
while(<>) {
chomp;
@data = split /a/, $_;
print(join("b",@data),"\n");
}
如果我输入一个包含这个的文件:
paaaa
paaaaq
我明白了
p
pbbbbq
但我期待
pbbbb
pbbbbq
为什么我期望后一种行为是错误的?
【问题讨论】:
documented 除非您指定第三个非零参数,否则将删除尾随空。
如果
LIMIT被省略(或等效为零),则通常将其视为负数,但尾随的空字段被剥离(始终保留空的前导字段)
你想要
split /a/, $_, -1;
【讨论】:
看一下split perldoc中的LIMIT参数:
http://perldoc.perl.org/functions/split.html
相关部分是:
如果 LIMIT 为负数,则将其视为任意大;生成尽可能多的字段。
如果 LIMIT 被省略(或等效为零),则通常将其视为负数,但尾随空字段被剥离(始终保留空前导字段)除外;如果所有字段都为空,则所有字段都被视为尾随(因此在这种情况下被剥离)。
所以要获得您期望的行为,请尝试:
while(<>) {
chomp;
@data = split /a/, $_, -1;
print(join("b",@data),"\n");
}
【讨论】:
因为在拆分 paaaa 之后,你得到了一个数组 @data,其中只有一个元素 p。 也许替换更好:
while(<>) {
chomp;
$_=~s/a/b/g;
print($_,"\n");
}
【讨论】: