Perl::查找子字符串并显示整个单词

Perl::查找子字符串并显示整个单词

我有一个文本文件,其中包含一些数据,例如:

 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)

我无法理解出了什么问题。

答案1

没有什么问题,它正常工作,但是您误解了正则表达式的工作原理。这.意味着“匹配任何字符”,因此.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";
    }
  }   
}

答案2

您可以按如下方式执行此操作:

$ perl -lsne 'print "FOUND: >>>$1<<<" if /(\Q$pin\E\((?:(?!\))\H)*\))/' -- -pin=".V15M" inp

结果:

FOUND: >>>.V15M(px_IOP059_VOUT15_OUT_V15M)<<<

在职的:

  • 正则表达式查找引脚,后跟左括号,一直到最近的右括号。

相关内容