我在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
。
有什么问题?
答案 0 :(得分:3)
cmp
运营商? $a cmp $b
会产生$a
和$b
之间的词典关系,这意味着它会返回三个值:
$a
小于$b
$a
等于$b
$a
大于$b
$a = "a";
$b = "a";
print ($a cmp $b);
输出 0 ,表示它们相等
STDIN
my $toto = <STDIN>;
当你使用这样的东西从STDIN
读取一行时(即在标量上下文中读取),它将读取整行,包括换行符。
这意味着$toto
为"a\n"
,而不仅仅是"a"
,这就是后者使用eq
失败的原因。
您可以使用chomp
修复此问题,这会从$toto
删除换行符,就像这样
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
)。