1

私は perl を初めて使用し、比較的単純な問題に対する perl ソリューションを探しています。perl を使用して、ファイルの行から重複した単語を削除したいと考えています。ウェブ上のすべての例は重複行を扱っていますが、重複した単語を削除する方法を探しています。どんな助けでも大歓迎です。

ここに私のファイルがあります

lot=list("XI_PBIAS.mMN_VDD_CAP1_BM" "XIBIAS2.mNCS_BIAS_BM" "XIBIAS2.mNCS_BIAS_BM"          "XIBIAS1.mNCS_PCAS_BIAS_BM" "XIBIAS1.mNCS_PCAS_BIAS_BM" "XI_PBIAS.mNCS_PCS_BIAS_BM" )
filename  = "tx_dac_bias_tb"
openResults(strcat(filename ".raw"))

"XIBIAS2.mNCS_BIAS_BM"文字列とを一度だけ表示したい"XIBIAS1.mNCS_PCAS_BIAS_BM"。行ごとではなく単語ごとにファイルを読み取るにはどうすればよいですか。

4

3 に答える 3

5

ファイルを 1 行ずつ読み取り、単語に分割します。

while (<>) {
   chomp;
   my @words = split;
   ...
}

重複を削除する方法はperlfaq4で回答されています。

my %seen;
my @unique = grep { ! $seen{$_}++ } @words;
于 2013-02-03T13:10:42.510 に答える
2

これは、Text::ParseWords(perl 5のコアモジュール)を使用して、括弧内の引用符で囲まれた文字列を解析する方法を示しています。これは元の空白を保持しないことに注意してください。また、入力内のすべての行が重複排除されるとは限らないため、一致する行の種類を指定する必要があります。

use strict;
use warnings;
use Text::ParseWords;

sub uniq {
    my %seen;
    grep { not $seen{$_}++ } @_;
}

while (<DATA>) {
    chomp;
    if (/^(.+=\s*list\()(.*)(\).*)$/) {
        my ($pre, $line, $post) = ($1, $2, $3);    # split into fields
        my @list = quotewords('\s+', 1, $line);    # find quoted strings
        @list = uniq(grep defined, @list);         # dedupe, remove empty
        $_ = "$pre@list$post";                     # join the line back up
    }
    print "$_\n";
}

__DATA__
lot=list("XI_PBIAS.mMN_VDD_CAP1_BM" "XIBIAS2.mNCS_BIAS_BM" "XIBIAS2.mNCS_BIAS_BM"          "XIBIAS1.mNCS_PCAS_BIAS_BM" "XIBIAS1.mNCS_PCAS_BIAS_BM" "XI_PBIAS.mNCS_PCS_BIAS_BM" )
filename  = "tx_dac_bias_tb"
openResults(strcat(filename ".raw"))

入力ファイルで使用するには、次のように置き換え<DATA>て使用します。<>

perl script.pl input.txt
于 2013-02-03T13:47:23.010 に答える