Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Perl比较运算符和字符串化;“数字”;_String_Perl_Comparison_Numbers_Operators - Fatal编程技术网

String Perl比较运算符和字符串化;“数字”;

String Perl比较运算符和字符串化;“数字”;,string,perl,comparison,numbers,operators,String,Perl,Comparison,Numbers,Operators,我最近一直在使用perl,但我真的不知道如果点之间的每个数字都具有相同的长度,字符串比较将如何工作。字符串比较不知道数字,将开始比较点和数字(因为它们都是字符串中的字符) 有一个CPAN模块,它可以完全满足您的需要:首先:请始终使用警告。你会立刻意识到以下几点: $perl-wle'打印1,除非“1.4.5”>“8.7.8” 参数“8.7.8”在-e第1行的数值gt(>)中不是数值。 参数“1.4.5”在-e第1行的数值gt(>)中不是数值。 PerlV5.9.0随附发布。此模块使比较版本号变

我最近一直在使用perl,但我真的不知道如果点之间的每个数字都具有相同的长度,字符串比较将如何工作。字符串比较不知道数字,将开始比较点和数字(因为它们都是字符串中的字符)


有一个CPAN模块,它可以完全满足您的需要:

首先:请始终使用警告。你会立刻意识到以下几点:

$perl-wle'打印1,除非“1.4.5”>“8.7.8”
参数“8.7.8”在-e第1行的数值gt(>)中不是数值。
参数“1.4.5”在-e第1行的数值gt(>)中不是数值。
PerlV5.9.0随附发布。此模块使比较版本号变得非常容易:

使用警告;
使用版本;
my($small,$large)=(版本->解析('1.4.5'),版本->解析('8.7.8');
如果$small>$large,则打印“larger\n”;
如果$small<$large,则打印“较小\n”;

当您使用数字关系运算符比较字符串时,如果
使用警告,Perl将发出警告。但是,Perl仍将尝试将字符串转换为数字。如果字符串以数字开头,Perl将使用这些数字,否则字符串等于0。在您的示例中,比较“1.4.5”和“8.7.8”与比较数字1.4和8.7具有相同的效果

但是对于
ne
gt
等,字符串是否由数字或其他任何东西(包括点)组成并不重要。因此:

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.3.4'gt'10.1.2'打印“更大”#打印“更大”,因为'2'>按字符串方式打印'1'
如果“02.3.4”gt“10.1.2”不打印任何内容,则打印“更大”,因为“0”字符串小于“1”

因此,您既不能使用
也不能确定其开销,但您可以尝试。特别是操作员

正如@tent指出的,@SebastianStumpf的解决方案很接近,但并不完全正确,因为:

>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
幸运的是,按照中的提示可以轻松解决此问题:

为了清晰起见,现在强烈建议使用前导的“v”,并将 如果省略,则在将来的版本中抛出警告

“1.4.5.6.7.8.0”不是一个数字。看,s
看起来像数字。实际上,你说的是“数字”:«我说的“数字”的意思是:“1.4.5.6.7.8.0”。然后你用了«
>
»,两边各有一个数字,所以即使你说的是“数字”,我的评论也是合适的。
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
>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
>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