2017-03-24 8 views
-2

私は気軽に基本正規表現を行い、一致した値を返すサブルーチンを書いていました。私は自分の入力がスカラー(配列-ref)として来ていないことに気がつきませんでした。そして次のコードで、私は 'linux'という言葉を返しました。array-refを正規表現して 'linux'という単語を抽出しようとしました

sub extract_currency { 
    my ($self, $price) = @_; 

    $price =~ m/^(.*)[\s?]\d/; 

    return $1; 
} 

は誰でも正規表現を介してメモリ・ロケーションを実行することでのPerl/Cレベルで起こっていたことにいくつかの洞察力を与えることはできますか?以前これを見てきたことはありませんでした。その結果、システム情報を一見してどうやって抽出できるのか不思議です。

+0

'[\ s?]'はオプションのスペースと一致するはずですか?それとも、単一のスペースや疑問符と一致するはずですか?それは後者と一致するためです。 – ThisSuitIsBlackNot

答えて

4

$1$2などが設定されています。マッチが失敗した場合、それらは設定解除されません。以前の一致の値が$1で、同じスコープ内に表示されています(例:

sub extract_currency { 
    my ($self, $price) = @_; 

    $price =~ m/^(.*)[\s?]\d/; 

    return $1; 
} 

'linux' =~ /(\w+)/; 

extract_currency(); # returns 'linux' 

perlvarの説明を参照してください。

この理由から、$1を使用する前に常に一致の成功を確認する必要があります。

また
sub extract_currency { 
    my ($self, $price) = @_; 

    if ($price =~ m/^(.*)[\s?]\d/) { 
     return $1; 
    } 

    return undef; 
} 

sub extract_currency { 
    my ($self, $price) = @_; 

    my ($currency) = $price =~ m/^(.*)[\s?]\d/; 

    return $currency; # could be undef 
} 
1

誰でも正規表現を介してメモリ・ロケーションを実行することでのPerl/Cレベルで起こっていたことにいくつかの洞察力を与えることはできますか?

正規表現には文字列が必要なため、オペランドを文字列にします。あなたはおそらく望ん

$ perl -e'my $ref = []; CORE::say($ref)' 
ARRAY(0x23cb218) 

$ perl -e'my $ref = []; bless($ref, "Class"); CORE::say($ref)' 
Class=ARRAY(0x29429e8) 

ので、

$ perl -e'CORE::say([ "Foo", "Bar" ] =~ /Foo/ ? "match" : "no match")' 
no match 

$ perl -e'CORE::say([ "Foo", "Bar" ] =~ /ARR/ ? "match" : "no match")' 
match 

sub extract_currency { 
    my ($self, $price) = @_; 
    return $price =~ /^([^\d\s]+)/ ? $1 : undef; 
} 

$o->extract_currency($prices->[0]) 

注:あなたが以下はblessされていない配列への参照の文字列化を示し、祝福された配列パターンは最後の桁まで(ただし、その桁を除く)すべてに一致するため、パターンは壊れています。 $1も使用され、一致が成功したかどうかをチェックせずにエラーが発生すると "ランダム"出力になりました。

関連する問題