我在谷歌搜索时遇到了麻烦,因为大多数人似乎都想知道如何删除回车。
我的代码有效,但看起来很尴尬,我错过了一些东西。可能是我的原始脚本设计得很差(我检查一个元素是否最后出现,如果是,我需要更改它),但仍然......似乎我错过了一个快速的方法使事情更顺畅。
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";
答案 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 Leffler和Alan 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 ;)
希望这有帮助