2

我想使用 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";
}

我想输出最终的字符串(在字符被删除之后)。

但是,这个程序没有给出正确的结果。你能指导我错误是什么吗?

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

4

6 回答 6

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
于 2012-04-05T17:46:05.647 回答
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
于 2012-04-04T19:52:10.710 回答
0

一般来说,您会希望发布您得到的结果。话虽如此...

文件中的每一行末尾都有一个\n(或\r\n在 Windows 上),您没有考虑到该行。你需要chomp()排队。

编辑添加:我的 perl 因不使用而生锈,但如果记忆对我有用,您实际上可以chomp()在读取文件后整个数组:chomp(@array)

于 2012-04-04T17:35:06.173 回答
0

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

@array=<FH>;
chomp(@array);
于 2012-04-04T17:37:54.487 回答
0
perl -plwe 'chomp; $c = length($_) % 3; chop while $c--' < /tmp/zock.txt

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

于 2012-04-04T18:01:32.710 回答
0

阅读您的代码,您正在尝试仅打印前 'nx3' 个字符,以获得每行的最大值 n。

下面的代码使用一个简单的正则表达式来做到这一点。

对于每一行,它首先删除行结尾,然后贪婪匹配尽可能多.{3}的(.匹配任何字符,{3}要求正好 3 个)。

这种方法的内存需求(与使用文件大小的数组相比)是固定的。如果您的文件与可用内存相比较小,这并不重要,但有时文件是千兆字节,有时内存非常小。

总是值得使用反映变量用途的变量名,而不是像$aor之类的东西@array。在这种情况下,我只使用了一个变量,我称之为$line.

完成文件后立即关闭文件也是一种好习惯。

#!/usr/bin/perl
use strict;
use warnings; # This will apply warnings even if you use command perl to run it

open FH, '<', 'input.txt'; # Use three part file open - single quote where no interpolation required.
for my $line (<FH>){
    chomp($line);  
    $line =~ s/((.{3})*).*/$1\n/;
    print $line;
}
close FH;
于 2021-11-25T14:18:10.520 回答