それもコンパイルされませんので、それが正しくありません:if
/else
は常にPerlで{
}
ブロックが続いています。また、if (match_found)
に変数の$
sigilがありません。
大文字と小文字の違いを無視する(つまり、大文字と小文字の違いを無視する)場合は、i
フラグを正規表現に追加する必要があります。
最後に、@big_string
配列を定義していないコードで、$big_string
スカラーのみが定義されています。
ので:
use strict;
use warnings;
use List::Util 'any';
my $big_string = "Hello Good World";
my $pat = "world";
my $match_found = any { /$pat/i } $big_string;
if ($match_found) {
print "yes\n";
} else {
print "no\n";
}
このコードは動作しますが、それを向上させることができます。
まずはany
を使用してください。私たちは、チェックするために、複数の文字列のリストを持っていない:正規表現することになっているよう
my $match_found = $big_string =~ /$pat/i;
第二に、$pat
は見えません。これは普通の文字列です。これは、英数字(例えば、world
)には違いはありませんが、一般に、正規表現として解釈されることを意図していない文字列のすべての正規表現メタキャラクタをエスケープする必要があります。これはquotemeta
機能(またはその\Q
\E
短い形式)で行うことができます。
my $match_found = $big_string =~ /\Q$pat\E/i;
これが私たちの改良版である:
use strict;
use warnings;
my $big_string = "Hello Good World";
my $pat = "world";
my $match_found = $big_string =~ /\Q$pat\E/i;
if ($match_found) {
print "yes\n";
} else {
print "no\n";
}
最後に、私たちも、簡単なために正規表現を必要としません部分文字列検索。代わりに、私たちはこれを行うことができます:
use feature 'fc';
my $match_found = index(fc($big_string), fc($pat)) >= 0;
fc
は完全なUnicodeケースフォールディングが実装されています。
あなたの構文は完全に間違っています。このコードを実行しようとしましたか?また、最初のコードブロックで単一の文字列について話していて、突然2番目の文字列の配列を持っています。 – simbabque
私はちょうどコードを書くことを試みたいと思う。それが正しいとは限りません。 – mahmood
それからあなたもそれを実行しようとするべきでしょう。通常、コードを書くことはそれを実行することを伴う。少なくとも私にとっては。 ;)そして、あなたがそれを実行したくないなら、あなたは 'perl -c'でそれを構文チェックすることができます。 – simbabque