【perlメモ】ワイルドカード「.」(ピリオド)がパターンに含まれるときマッチしてしまわないようにするには?
たいした話ではないが、ちょっとしたことではまったりするのでメモ。
if("version" =~ m/ver./){
}
これをマッチしないようにするには
if("version" =~ m/ver\./){
}
こうする。当たり前すぎ。
test.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
my $pattern = "ver.";
my $str1 = ‘version’;
my $str2 = ‘ver.’;
if($str1 =~ /($pattern)/){
print "str1 match $1\n";
}else{
print "str1 un match\n";
}
if($str2 =~ /($pattern)/){
print "str2 match $1\n";
}else{
print "str2 un match\n";
}
パターンを変数に入れてマッチングする場合。 上のソースを実行すると
F:\kumacchi\MyProgram\perl\sample\tmp>perl test.pl
str1 match vers
str2 match ver.
F:\kumacchi\MyProgram\perl\sample\tmp>
versionにもver.にもマッチしてしまう。普通にver.だけにマッチさせているつもりがversionにもマッチしてしまっている場合があったりする。「ver.」にだけマッチさせたい場合。
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
my $pattern = "ver.";
my $str1 = ‘version’;
my $str2 = ‘ver.’;
$pattern =~ s/\./\\./g;
if($str1 =~ /($pattern)/){
print "str1 match $1\n";
}else{
print "str1 un match\n";
}
if($str2 =~ /($pattern)/){
print "str2 match $1\n";
}else{
print "str2 un match\n";
}
上のように修正して、実行する。
F:\kumacchi\MyProgram\perl\sample\tmp>perl test.pl
str1 un match
str2 match ver.
F:\kumacchi\MyProgram\perl\sample\tmp>
「ver.」にだけマッチするようになった。他の方法としては「/\Q($pattern)\E/」の様に\Q\Eでパターンを囲む。
他にも「*」「?」等も同様に処理する必要がある。固定のパターンではなくデータとして大量のパターンマッチングを行なうときに考慮していないと変なマッチングになってハマることがあるので注意。