2013-12-03 4 views
5

perlの出力が変更されました。明らかにバージョン5.10.1と5.14.2の間で変更されていますが、少なくとも完全には変更されていません。 いつ、なぜqr()の出力が変化しましたか?

はバージョンごとに、次のワンライナーを実行し、変更を証明するために:

perl -e 'print qr(foo)is."\n"' 

perlの5.10.1-17squeeze6(Debianのスクイズ)からの出力:perlの5.14から

(?-xism:foo) 

出力0.2から21 + deb7u1(喘鳴Debianの):

(?^:foo) 

Perlのドキュメント(perldoc perlop)は言います:

$レックス= QR/my.STRING /です。
print $ rex; #prints(?si-xm:my.STRING)
s/$ rex/foo /;

はもはや真でないように見える:

$ perl -e 'print qr/my.STRING/is."\n"' 
(?^si:my.STRING) 

私は、この変更が発生したときに知っている(これはPerlのバージョン、またはサポートライブラリまたは何でも)したいと思います。

いくつかの背景には、ケースでは、関連性の:

この変更は、ユニットテストの束が失敗する原因となっています。単体テストを更新して新しいフォーマットを反映するか、どちらのフォーマットにも対応できるようにテストを動的にするべきかどうかを判断する必要があります。情報に基づいた判断を下すために、なぜその変更が行われたのかを理解したいと思います。いつ、どこで起こったのかを知ることは、その調査から始めるのに最適な場所のようです。

+4

あなたの用語や 'qr'が何をしているのか分かりませんが、それは正しいことではありません。 「qrの出力」と言うのは正しいことではありません。 'qr'は正規表現オブジェクトを生成する演算子です。変更されたのは、正規表現の文字列化です。 'qr'の動作は変更されていません。 –

+0

@AndyLester:テクニカルになりたい場合は、少なくとも新しい正規表現修飾子が使用されている場合は出力*が変更されました。しかしそれは本当にポイントの横にある。あなたは質問の意味を理解しましたか?そして、私は、より正解であるかもしれない方法でそれを表現することは、将来この答えを探すかもし​​れない多くの人々のために意味を失うだろうと思う。 – Flimzy

+1

'qr'には出力がありません。オブジェクトを返します。その "出力"、すなわちそのオブジェクトの文字列は、変更されたものです。 'print qr/foo/i'の場合、文字列化は暗黙的です。 –

答えて

12

それはperl5140deltaに記載されます:

正規表現

(?^...)コンストラクトは、正規表現の[...]文字列化は今、この表記を使用して、デフォルトの修飾子に

を意味します。 [...]

この変更は、文字列化された正規表現と?-xismを含む固定文字列とを比較するコードを破損する可能性があります。

関数regexp_patternを使用して、正規化の目的で修飾子を解析することができます。

5

これが追加された理由の一部は、正規表現にはかなり新しい修飾子が追加されていたということでした。

その変化が起こらなかった場合はあなたの例では、実際にこのような何かを生み出す

(?d-xismpaul:foo) 

も本当に場所に修飾子を発現しません。

d/u/は、iのように、正規表現には追加できません。
これらは相互に排他的です。

a/aa実際には、この修飾語には2つのレベルがあります。


これらの修飾子を追加する作業が進行中になっても、CPANモジュールでかなりのテストが行​​われることが判明しました。 テストが途中で中断しているのを見て、を指定する方法があることが合意されました。デフォルトは(?^:…))です。 このようにして、新しい修飾子が追加されるたびにテストを更新する必要はありません。

-1

文字列形式の正規表現を受け取るには、Regexp::Parserとそのqrメソッドを使用できます。このモジュールを使うと、正規表現の表現をテストするだけでなく、ツリーを歩くこともできます。

+0

それは面白いですが、質問に答えません。 – Flimzy

+0

正しい。しかし、これはTSとして、別の角度で問題を見るのに役立ちます:_representation_をテストする代わりに、_機能性をテストすることができます(ツリーをトラバースするか、テストツリーと比較する)。このようにして、将来の互換性のないPerlエンジンの変更(たとえば表現上の意味でのみ)に対しても、あなたのコードを弾丸にすることができます。 – maxim4d

+0

答えではなくコメントでなければなりません。 – Flimzy

関連する問題