2009-12-04 7 views
66

は私が持っていると仮定します。文字列の一致数をカウントするためのPerlショートカットはありますか?

my $string = "one.two.three.four"; 

は、どのように私はパターンがマッチ(3)見つかった回数を取得するには、コンテキストと遊ぶべきですか? 1ライナーでこれを行うことはできますか?

私はこの試みた:私は$numberの周りに括弧を置くことによって、私は配列コンテキストを強制するだろう、とscalarを使用することによって、私は数を取得したいと思っ

my ($number) = scalar($string=~/\./gi); 

を。しかし、私が得るのは1です。

答えて

102

これは正規表現自体をスカラーコンテキストに置きます。これはあなたが望むものではありません。代わりに、正規表現をリストコンテキストに入れて(マッチする数を取得する)とし、スカラーコンテキストにします。

my $number =() = $string =~ /\./gi; 
+2

まあ、perlsecretは代替名として "Saturn"を提案しています。 :) – oalders

7

はこれを試してみてください:


my $string = "one.two.three.four"; 
my ($number) = scalar(@{[ $string=~/\./gi ]}); 

それは私のために3を返します。配列への参照を作成することで、正規表現はリストコンテキストで評価され、は配列参照を参照解除します。

+3

あなたはそれらの括弧のいずれかを必要としません。 –

+1

私はこの方法がヤギよりも好きだと言わなければならない。実際には、私はほとんどすべてのものが山羊よりも好きです。 – Wick

31

私はこれを説明する最も明白な方法は、スカラーへのインスタントキャストを避けることだと思います。最初に配列に代入し、その配列をスカラーコンテキストで使用します。それは=() =イディオムがどうなるか、基本的だが、(めったに使われない)イディオムなし:また

my $string = "one.two.three.four"; 
my @count = $string =~ /\./g; 
print scalar @count; 
+12

最も簡単な方法で+1、goatse演算子は恐ろしいです。 –

+1

しかし、 '@ count'の前後のかっこは不要です。 –

19

Perlfaq4を参照してください。効率を変化させ、いくつかの方法があります

。あなたは、文字列内の特定の単一の文字(X)のカウントをしたい場合は、そのようにTR ///の機能を使用することができます。あなただけの単一の文字を探しているなら、

$string = "ThisXlineXhasXsomeXx'sXinXit"; 
$count = ($string =~ tr/X//); 
print "There are $count X characters in the string"; 

これで結構です。しかし、大きな文字列内の複数の文字部分文字列を数えようとすると、tr ///は機能しません。あなたができることは、グローバルパターンマッチの周りにwhile()ループをラップすることです。たとえば、のは、負の整数を数えてみましょう:

$string = "-9 55 48 -2 23 -76 4 14 -44"; 
while ($string =~ /-\d+/g) { $count++ } 
print "There are $count negative numbers in the string"; 

別のバージョンは、一致の数のカウントを生成、スカラーに結果を代入し、リストコンテキストでグローバルマッチを使用しています。

$count =() = $string =~ /-\d+/g; 
1

別の方法 、

my $string = "one.two.three.four"; 
@s = split /\./,$string; 
print scalar @s - 1; 
7

は、次のコードワンライナーですか?

print $string =~ s/\./\./g; 
+0

いいです。ありがとう! – Geo

0

フリードの方法は、$a =() = $b =~ $cである。

しかし、それはそうのように、ちょうど($a) = $b =~ $cにさらにこれを簡素化することが可能です:

my ($matchcount) = $text =~ s/$findregex/ /gi; 
+0

これは置換であり、一致ではないことを除いて、元の文字列を破壊します。そして、@Mikeが6年前に持っていたのと同じ考えです。 – fishinear

関連する問題