2016-09-08 2 views
4

文字列が複数の正規表現パターンに一致するかどうかをチェックしたいと思います。パターンのいずれかが一致した場合smartmatchを使用して配列内のすべてのパターンに一致する文字列を確認するにはどうすればよいですか?

my @matches = (
    qr/.*\.so$/, 
    qr/.*_mdb\.v$/, 
    qr/.*daidir/, 
    qr/\.__solver_cache__/, 
    qr/csrc/, 
    qr/csrc\.vmc/, 
    qr/gensimv/, 
); 

if($_ ~~ @matches){ 
    ... 
} 

if文が入力されているが、私は確認したいそのパターンマッチのすべて:私はスマートマッチ演算子を使用してrelated question、ブラッド・ギルバートansweredに出くわしました。これどうやってするの?

+0

基本的には、プリコンパイルされた正規表現のリストがあり、すべてのパターンがsmartmatch演算子のRHSと一致する場合にtrueを返すコードを記述します。そのような場合は、あなたの質問を編集して、それとサンプルの入出力を含めてください。 – simbabque

+1

_smart-matching_と_smartmatch_のタグ同義語を作成する必要があります。 – simbabque

+0

@simbabqueスマート・マッチングは、スマート・マッチングはスマート・マッチの同義語でなければなりません。[オペレータの名前はスマート・マッチです](http://perldoc.perl.org/perlop.html#Smartmatch-Operator)。 [同義語を提案して承認する](http://stackoverflow.com/tags/smartmatch/synonyms)できる唯一のユーザーは、池上、ジョエルバーガー、raina77ow、ケニーであり(ただし、すべて投票する必要があります)、あなたはいくつかの既存の質問に戻るか、この質問に対するあなたの答えに+5を得る。しかし、タグは最初の場所でも必要ですか?私は言語のすべての演算子のタグを必要とは思わない。 – ThisSuitIsBlackNot

答えて

2

スマートマッチ演算子はそれをサポートしていません。あなたはそれを自分で構築する必要があります。 List::MoreUtils 'allそうするのはすばらしいようです。

use strict; 
use warnings 'all'; 
use feature 'say'; 
use List::MoreUtils 'all'; 

my @matches = (
    qr/foo/, 
    qr/ooo/, 
    qr/bar/, 
    qr/asdf/, 
); 

my $string = 'fooooobar'; 
say $string if all { $string =~ $_ } @matches; 

これは出力されません。

$string'fooooobarasdf'に変更すると、文字列が出力されます。

+4

とにかくスマートマッチを使用すべきではないことは注目に値する。これは実験的なものであり、予告なく削除または変更されます*。 (このような音は5.26で起こります) – ikegami

+0

@ikegamiはい。私はあなたのようなコメントを予定していたが、忘れてしまったので、答えの中から目的を追い出さなかった。 – simbabque

+1

[List :: Util](https://metacpan.org/pod/List::Util#all)にも最近の 'all'があるので、List :: MoreUtilsは必要ありません。 – melpomene

関連する問題