PERL:如何优雅地搜索/替换回车?

时间:2016-06-09 02:43:38

标签: regex perl replace

我在谷歌搜索时遇到了麻烦,因为大多数人似乎都想知道如何删除回车。

我的代码有效,但看起来很尴尬,我错过了一些东西。可能是我的原始脚本设计得很差(我检查一个元素是否最后出现,如果是,我需要更改它),但仍然......似乎我错过了一个快速的方法使事情更顺畅。

use strict;
use warnings;

my $a = "This is a string that I concatenate beforehand with carriage returns, so it's hard to separate out.\nThis is the last line I want to track.\nI want to delete this line.";
my $b = $a;

$b =~ s/(track\.).*/$1/g;

print "THIRD LINE STILL THERE\n$b\n\n";

my @c = split(/\n/, $a);
for (0..$#c) { 
   if ($c[$_] =~ /last line/) { 
      $b = join("\n", @c[0..$_]); 
      last; 
   } 
}

print "THIRD LINE GONE. IT WORKS, BUT I THINK THERE MUST BE A BETTER WAY.\n$b\n";

5 个答案:

答案 0 :(得分:3)

你的代码中有一个很好的方法,需要更多一点 - 没有必要迭代。

这将删除多行字符串中的最后一行。

my @lines = split '\n', $line;
pop @lines;
my $text = join '\n', @lines;

pop删除数组中的最后一个元素。或者,如果您希望保持@lines整个

my @lines = split '\n', $line;
my $text = join '\n', @lines[0..$#lines-1];

请注意,如果文本的“last”行本身以换行符结束(因此,如果后面跟一个空行),split很好地不会返回额外的元素,因为它会丢弃所有尾随然后返回列表中的空字段。所以上面的代码保持不变。

请注意Jonathan LefflerAlan Moore的评论。从后者

  

“换行符”是用于分隔行的任何内容的通用术语,包括换行符(\n),回车符(\r),回车换行符对(\r\n ),以及其他一些更具异国情调的人物。

如果您要查找“回车”,每个标题或其他形式的“换行符”,则需要调整\n split以上和join。例如,请参阅他们的Representations on Wikipedia

答案 1 :(得分:2)

这应该有效:

$b =~ s/track\..*/track\./sg;

答案 2 :(得分:1)

您可以使用rindex()获取字符串中位置的最后一个索引,并将其与substr()组合。像这样:

$b = substr($a, 0, rindex($a, "\\n"));

如果要将新行字符保留在字符串的末尾,请执行以下操作:

$b = substr($a, 0, rindex($a, "\\n") + 1);

答案 3 :(得分:1)

mov bl, ATTRIB
mov bh, 00

分割数组并迭代它没有任何问题。如果你想在一个正则表达式中完成它,你也可以通过查找目标字符串来完成它。

另外需要注意的是避免使用my $string = $a; $string =~ s/I want to delete[^\n]*\n//gs; $a,因为它们经常被用作内部变量。

答案 4 :(得分:1)

如果我理解你的问题,那么你需要的是pop

use strict;
use warnings;

my $a = "This is a string that I concatenate beforehand with carriage returns, so it's hard to separate out.\nThis is the last line I want to track.\nI want to delete this line.";

my @lines     = split(/\n/, $a);
my $last_line = pop @lines;

print join('\n', @lines) . "\n"; # first two lines
print $last_line . "\n"; # in case you still want to use it ;)

希望这有帮助