以下のデータの一部を含むテキストファイルがあります。
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
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)<<<
布材:
- 正規表現はピンを見つけ、左角かっこから最も近い右角かっこまで探します。