2017-11-18 10 views
-1

perlでは、文字列内の部分文字列を探したいと思います。結果は真/偽であり、次に私は何をすべきかを決めるでしょう。良い投稿hereがありますが、その用途は私にとってはあいまいです。perlでの部分文字列の一致、yesまたはno

my $big_string = "Hello Good World"; 
my $pat = "world"; 

大文字/小文字は重要ではありませんが、私は真になりたいです。

use List::Util 'any'; 
my $match_found = any { /$pat/ } @big_string; 
if (match_found) 
    print "yes\n"; 
else 
    print "no\n"; 

これは間違いありませんか?この目的のために、より良いAPIはありますか?

+2

あなたの構文は完全に間違っています。このコードを実行しようとしましたか?また、最初のコードブロックで単一の文字列について話していて、突然2番目の文字列の配列を持っています。 – simbabque

+0

私はちょうどコードを書くことを試みたいと思う。それが正しいとは限りません。 – mahmood

+3

それからあなたもそれを実行しようとするべきでしょう。通常、コードを書くことはそれを実行することを伴う。少なくとも私にとっては。 ;)そして、あなたがそれを実行したくないなら、あなたは 'perl -c'でそれを構文チェックすることができます。 – simbabque

答えて

3

それもコンパイルされませんので、それが正しくありません: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ケースフォールディングが実装されています。

+0

'fc'は5.16+でのみ利用可能です。 – simbabque

+0

私はこの仕事のために正規表現を使用しないと思います。私は部分文字列一致を見つけたい。両方の文字列はプレーンテキストで、パターンは単語全体です。 – mahmood

+2

@simbabque 5.16は5年間出ています。私はそれで大丈夫です。 :-) – melpomene

関連する問題