Text-Processing

Perl::查找子字元串並顯示整個單詞

  • July 4, 2019

我有一個文本文件,其中包含一些數據,例如:

PADHOGOA1 IOP055_VINREG5_1 ( .IO(VINREG5_1), .MONI(),
.MON_D(px_IOP055_VINREG5_1_MON_D), .R0T(px_IOP054_VINREG5_0_R0T),
.IO1() );

PADV30MA0 IOP056_VOUT3_IN ( .IO(VOUT3_IN),
.V30M(px_IOP056_VOUT3_IN_V30M));

PADV30MA0 IOP057_VOUT3_OUT ( .IO(VOUT3_OUT),
.V30M(px_IOP057_VOUT3_OUT_V30M) );

PADV15MA0 IOP059_VOUT15_OUT ( .IO(VOUT15_OUT),
.V15M(px_IOP059_VOUT15_OUT_V15M) );

PADHOGOA1 IOP064_VREFLB ( .IO(VREFLB), .MONI(), .MON_D(px_IOP064_VREFLB_MON_D), .R0T(px_IOP064_VREFLB_R0T), .IO1() );

我的子字元串是.V15M

我找到了這個子字元串並想顯示整個單詞。

期望的輸出:

.V15M(px_IOP059_VOUT15_OUT_V15M)

請需要一些幫助。

我正在嘗試的程式碼是:

my $var= '.V15M';
open(my $file,'<',"filename") or die $!;
while(<$file>){
chomp;
@words=split(",",$_);
foreach my $word(@words){
if($word =~ /$var/){
print "FOUND",$word, "\n";
}
}   
}

我得到的輸出是: PADV15MA0 IOP059_VOUT15_OUT ( .IO(VOUT15_OUT)

我無法理解出了什麼問題。

沒有什麼問題,它可以正常工作,但是您誤解了正則表達式的工作原理。意思是“.匹配任何字元”,所以.V15M會匹配DV15in PADV15MA0,這就是你得到的原因:

FOUND PADV15MA0 IOP059_VOUT15_OUT ( .IO(VOUT15_OUT)
FOUND .V15M(px_IOP059_VOUT15_OUT_V15M) );

你想要的是這樣的:

#!/usr/bin/perl -w
my $var= '\.V15M';
open(my $file,'<',"filename") or die $!;
while(<$file>){
 chomp;
 @words=split(",",$_);
 foreach my $word(@words){
   if($word =~ /$var/){
     print "FOUND",$word, "\n";
   }
 }   
}

這將返回:

FOUND .V15M(px_IOP059_VOUT15_OUT_V15M) );

但是,您的程式碼建議您只需要單詞,因此如果是這種情況,請將輸入行拆分為空格,而不是逗號(您的文件中沒有任何逗號):

#!/usr/bin/perl -w
my $var= '\.V15M';
open(my $file,'<',"filename") or die $!;
while(<$file>){
 chomp;
 @words=split(" ",$_);
 foreach my $word(@words){
   if($word =~ /$var/){
     print "FOUND ",$word, "\n";
   }
 }   
}

引用自:https://unix.stackexchange.com/questions/527390