2012-03-30 10 views
9

最近私はperlでたくさん働いていますが、まだ実際にはわかりません<,>,>=,=<, ne,gtなど..文字列化された "数字"、 "数字"私が間違っている場合は.5.6.7.8.0'Perlは演算子と文字列化された "数値"を比較します

には、以下の戻りは本当、私を修正:

if ('1.4.5' > '8.7.8'); 

両方が真(ない空の文字列)に強制変換されますので。 しかし、ne,gtなどの文字列演算子はどのようにそのような数値で動作しますか?

基本的に私は、バージョン番号を比較しようとしているが、次の形式で構成さ:

1.3.4.0.2 

私は、各桁の数値の比較を行うことができますが、前に、私は、演算子を比較 文字列を知りたいrantherそのような文字列に対して実行します。ドット間のすべての数が同じ長さを持っている場合

おかげで、

+1

"1.4.5.6.7.8.0は" 数ではありません。 [perldata](http://perldoc.perl.org/perldata.html)と[Scalar :: Util](http://search.cpan.org/perldoc?Scalar::Util)の 'looks_like_number'を参照してください。 – ikegami

+0

私は "数字" – snoofkin

+1

と言った実際には、あなたは "数字"と言った:«番号で "私は何かのような意味: '1.4.5.6.7.8.0'»。そして、あなたは "'> 'を使いました。これは両側に*の数字が付いているので、あなたが"数字 "と言っても私のコメントは適切です。 – ikegami

答えて

17

:くださいuse warningsすべての時間。一度に次のことを実現しています:

$ perl -wle 'print 1 unless "1.4.5" > "8.7.8"' 
Argument "8.7.8" isn't numeric in numeric gt (>) at -e line 1. 
Argument "1.4.5" isn't numeric in numeric gt (>) at -e line 1. 

のPerl v5.9.0は​​versionと一緒に配布来ました。そして、このモジュールはバージョン番号を比較することは非常に簡単です:あなたが数値の関係事業者に<を使用して文字列、>などを比較すると、あなたuse warnings場合

use warnings; 
use version; 

my ($small, $large) = (version->parse('1.4.5'), version->parse('8.7.8')); 

print "larger\n" if $small > $large; 
print "smaller\n" if $small < $large; 
8

文字列の比較のみ動作します。文字列の比較はの数字の知識がなく、ドットと数字の比較が始まります(文字列の両方の文字であるため)。

あり、あなたが探しているんまさにCPANモジュール:まずSort::Versions

3

、Perlは警告を発行します。しかし、Perlは文字列を数値に変換しようとします。文字列が数字で始まる場合、Perlはこれらを使用します。それ以外の場合は文字列は0になります。 '1.4.5'と '8.7.8'を比較する例では、数字1.4と8.7を比較するのと同じ効果があります。

ne,gtなどです。文字列が数字やその他のもの(ドットを含む)で構成されている場合は、実際には問題ありません。したがって:あなたはバージョン比較のためなど><などもgtlt、どちらを使用することはできません

print "greater" if '2.3.4' gt '10.1.2' # prints 'greater' because '2' > '1' stringwise 
print "greater" if '02.3.4' gt '10.1.2' # prints nothing because '0' < '1' stringwise 

はそのため、あなたは例えば、別の回答で提案されているように、別のアプローチを選択する必要があります。

2

このオーバーヘッドではわかりませんが、Sort::Naturallyとお試しください。特に、演算子はncmpです。

2

@tentが指摘したように、ためSebastianStumpfのソリューションはかなり右に近いのではなく、@:

大手「V:

>perl -Mversion -e 'my @n = ("1.10", "1.9"); print "$n[0] is " . (version->parse($n[0]) > version->parse($n[1]) ? "larger" : "smaller") . " than $n[1]\n";' 
1.10 is smaller than 1.9 

は幸運なことに、これが簡単にversion's documentationでヒント以下に解​​決されます'は現在、明確にするために強く推奨されており、省略された場合、将来のリリースで警告を表示します( )。

>perl -Mversion -e 'my @n = ("1.10", "1.9"); print "$n[0] is " . (version->parse("v$n[0]") > version->parse("v$n[1]") ? "larger" : "smaller") . " than $n[1]\n";' 
1.10 is larger than 1.9 
関連する問題