我有一个文本文件,其中包含一些数据,例如:
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
将匹配DV15
in 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)<<<
在职的:
- 正则表达式查找引脚,后跟左括号,一直到最近的右括号。