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これが非常に明確になります。Perlv5.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ウィンドウ上)があります。あなた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

コードを読んで、各行のnの最大値に対して最初の「nx3」文字だけを出力しようとしています。

次のコードは、単純な正規表現を使用してこれを実行します。

各行について、最初に行末を削除し、次に貪欲に可能な限り多くの文字に一致.{3}します(.任意の文字に一致{3}し、正確に3つを要求します)。

このアプローチのメモリ要件(ファイルサイズの配列を使用する場合と比較して)は固定されています。ファイルが空きメモリと比較して小さい場合はそれほど重要ではありませんが、ファイルがギガバイトである場合や、メモリが非常に小さい場合があります。

$aまたはのようなものではなく、変数の目的を反映する変数名を使用することは常に価値があります@array。この場合、私は1つの変数のみを使用しました。これを呼び出し$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 に答える