Perl字符串比较

时间:2015-10-04 10:38:09

标签: perl

我在Perl中遇到链式比较的基本问题。

use strict;
use warnings;

my $toto ="a";

if ("a" cmp $toto)
{
    print "success";
}
else
{
    print "fail\n";
}

my $titi=<STDIN>;

总是说fail

如果我使用eq而非cmp,则可以使用。

但如果我这样做:

my $toto = <STDIN>;

if ("a" eq $toto)
{
    print "success";
}
else
{
    print "fail\n";
}

my $titi=<STDIN>;

我使用a作为输入,打印fail

有什么问题?

4 个答案:

答案 0 :(得分:3)

什么是cmp运营商?

$a cmp $b会产生$a$b之间的词典关系,这意味着它会返回三个值:

  • -1 表示$a小于$b
  • 0 表示$a等于$b
  • 1 表示$a大于$b
$a = "a";
$b = "a";

print ($a cmp $b);

输出 0 ,表示它们相等


STDIN

阅读
my $toto = <STDIN>;

当你使用这样的东西从STDIN读取一行时(即在标量上下文中读取),它将读取整行,包括换行符。

这意味着$toto"a\n",而不仅仅是"a",这就是后者使用eq失败的原因。

您可以使用chomp修复此问题,这会从$toto删除换行符,就像这样

snippet.pl

my    $toto = <STDIN>;
chomp $toto;

if ( $toto eq "a" ) {
   print "Yes!\n";
}

示例运行将如下所示

$ perl snippet.pl
a<return>
Yes!

答案 1 :(得分:1)

cmp 是比较运算符,主要用于排序字符串。 bash$ perl -e 'print sort { $a cmp $b } qw( y z x); print "\n"' xyz 中记录了此运算符。

  

Binary&#34; cmp&#34;返回-1,0或1,具体取决于是否为左   参数是stringwise小于,等于或大于右边   参数。

例如:

{{1}}

答案 2 :(得分:1)

查看 perldoc perlop 相等运算符:

  

如果左参数的字符串等于右参数,则二进制“eq”返回true。

     

二进制“cmp”返回-1,0或1,具体取决于左参数是否是字符串小于,等于或大于右参数。

而不是"a" eq $toto尝试button或更改条件语句以使用作为成功

答案 3 :(得分:0)

它不起作用的原因是因为cmp不是eq。他们在平等上返回不同的值。

#!/usr/bin/env perl

use strict;
use warnings;

my $string = "fish";

print $string cmp $string;
print $string eq $string;

eq如果匹配则为1(true),如果不匹配则为0(false)。 cmp如果在(真)之前返回-1,如果等于(假)则返回0,如果在之后则返回+1。具体来说 - 这用于排序。 (并且它的对应<=>做了同样的事情,也许更明显的是它没有比较平等)。

最终结果是 - 你不小心颠倒了程序的逻辑。

print "1 True","\n" if "fish2" cmp "fish3";
print "2 True","\n" if "fish2" cmp "fish2";
print "3 True","\n" if "fish2" cmp "fish1";

您可以使用not来否定cmp,但实际上答案是 - 请改用eq

(另外 - 阅读chomp时不要忘记STDIN)。