我是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"
只出现一次。如何逐字而不是逐行读取文件。
答案 0 :(得分:5)
逐行读取文件,然后将其拆分为单词。
while (<>) {
chomp;
my @words = split;
...
}
如何删除重复内容已在perlfaq4中解答。
my %seen;
my @unique = grep { ! $seen{$_}++ } @words;
答案 1 :(得分: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
答案 2 :(得分:0)
试试这个Perl正则表达式 S /(。*)\ 1 / $ 1 /克