3

if ステートメントを含む perl スクリプトを作成しようとしています。この if ステートメントで、保存された文字列で正規表現を介して文字列が特定の回数見つかったかどうかを確認します。可能であれば、次のように想像して、これを1行で実行したいと思います。

$saved_string = "This abc is my abc test abc";
if( #something_to_denote_counting ($saved_string =~ /abc/) == 3)
{
    print "abc was found in the saved string exactly 3 times";
}
else
{
    print "abc wasn't found exactly 3 times";
}

...しかし、正規表現が一致する回数を確認するためにその if ステートメントで何をする必要があるのか​​ わかりません。これが可能かどうか誰か教えてください。ありがとう!

4

2 に答える 2

9
if ( 3 == ( () = $saved_string =~ /abc/g ) ) {
    print "abc was found in the saved string exactly 3 times";
}

カウントを取得するには、リスト コンテキストで /g を使用する必要があります。したがって、次のことができます。

@matches = $saved_string =~ /abc/g;
if ( @matches == 3 ) {

しかし、perl はそれを簡単にするためのちょっとした助けを提供します。スカラー コンテキスト ( によって提供されるものなど) に配置されたリスト代入は、代入の右側==にある要素の数を返します。これにより、次のようなコードが有効になります。

while ( my ($key, $value) = each %hash ) {

したがって、次のことができます。

if ( 3 == ( @matches = $saved_string =~ /abc/g ) ) {

しかし、配列を使用する必要さえありません。空のリストに割り当てるだけで十分です (リスト コンテキストでコードを実行する必要があるが、結果の数だけを取得する必要がある場合は常にイディオムになっています)。

于 2013-08-02T16:34:24.817 に答える
3

一致を anon 配列参照に保存し、それを使用して逆参照し、@{}数値と比較します。

if( @{[ $saved_string =~ /abc/g ]} == 3) {
  print "abc was found in the saved string exactly 3 times";
}
于 2013-08-02T16:49:47.837 に答える