使用Perl从多行的末尾删除n个字符

时间:2012-04-04 17:31:17

标签: string perl

我想使用PERL从每行中删除n个字符。

例如,我有以下输入:

catbathatxx(长度11; 11%3 = 2个字符)(从此行中删除2个字符)

mansunsonx(长度10; 10%3 = 1个字符)(从此行删除1个字符)

#!/usr/bin/perl -w
open FH, "input.txt";
@array=<FH>;
foreach $tmp(@array)
{
$b=length($tmp)%3;
my $c=substr($tmp, 0, length($tmp)-$b);
print "$c\n";
}

我想输出最后一个字符串(删除字符后)。

但是,该程序未给出正确的结果。你能告诉我这个错误是什么吗?

非常感谢。如果有任何疑问/澄清,请告诉我。

5 个答案:

答案 0 :(得分:1)

我假设尾随空格不重要。

#!/usr/bin/env perl

use strict; use warnings;

use constant MULTIPLE_OF => 3;

while (my $line = <DATA>) {
    $line =~ s/\s+\z//;
    next unless my $length = length $line;
    my $chars_to_remove = $length % MULTIPLE_OF;
    $line =~ s/.{$chars_to_remove}\z//;
    print $line, "\n";
}

__DATA__
catbathatxx
mansunsonx
0123456789
012345678

答案 1 :(得分:1)

\K正则表达式序列使这更加清晰;它是在Perl v5.10.0中引入的。

代码看起来像这样

use 5.10.0;
use warnings;

for (qw/ catbathatxx mansunsonx /) {
  (my $s = $_) =~ s/^ (?:...)* \K .* //x;
  say $s;
}

<强>输出

catbathat
mansunson

答案 2 :(得分:0)

一般情况下,您希望发布 获取的结果。那就是说......

文件中的每一行在其末尾都有\n(或\r\n窗口),而您没有考虑到这一行。你需要chomp()这一行。

编辑添加:我的perl因不使用而变得生锈但是如果内存对我有用,那么在阅读文件后您实际上可以chomp()整个数组:chomp(@array)

答案 3 :(得分:0)

您应该在数组上使用chomp(),如下所示:

@array=<FH>;
chomp(@array);

答案 4 :(得分:0)

perl -plwe 'chomp; $c = length($_) % 3; chop while $c--' < /tmp/zock.txt

perlrun中查找选项。请注意,行结尾也是字符。使用chomp将它们排除在外;使用-l选项在输出上重新添加它们。使用chop可以有效地从字符串末尾删除字符。