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

逐行读取文件,然后将其拆分为单词。

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 回答
0

试试这个 Perl 正则表达式 s/(.*)\1/$1/g

于 2017-07-24T08:42:34.947 回答