您好我正在编写一个perl脚本来完成一些任务。在我的脚本中,我使用一个if循环来比较两个字符串,如下所示。
if($feed_type eq "SE"){
...........}
上面的代码没有给我任何警告,但输出并不像我预期的那样。
如果我使用'eq'
而不是'='
,我会收到expectng '==' but '=' is present
的警告。但我得到了预期的输出。
理想情况下,对于字符串比较,我必须使用'eq'
和数字'=='
。在这种情况下,它无法正常工作。任何人都可以弄清楚这里有什么问题吗?
更多信息:
这个if
循环出现在子程序中。 $feed_type
是此子例程的输入。我正在阅读如下输入:
my $feed_type=@_;
问题是解决的。我刚刚更改了feed_type的assignemet语句,如下所示
my $feed_type=$_[0];
并且它将值读为SE
并且代码正常运行。
但我仍然不知道为什么my $feed_type=$_[0];
没有工作。
答案 0 :(得分:4)
=
可能代替eq
,但不是出于您的想法。
#!/usr/bin/env perl
use strict;
use warnings;
my $test = "fish";
my $compare = "carrot";
if ( $test = $compare ) {
print "It worked\n";
}
当然,问题是 - 它总是工作,因为你正在测试作业操作的结果。*
*好的,有时候分配操作不起作用 - 这就是为什么一些编码样式建议测试if ( 2 == $result )
而不是相反的原因。
答案 1 :(得分:2)
这是关于Perl的核心概念:Context。根据上下文,操作符和函数的工作方式不同。在这种情况下:
my $feed_type = @_;
您正在将标量上下文中的数组赋值给变量。标量上下文中的数组返回其大小,而不是其中的元素。要使此分配按预期工作,您必须直接访问所需的标量值,如您所建议的那样:
my $feed_type = $_[0];
...或者您可以通过添加括号将您的变量放在列表上下文中:
my ($feed_type) = @_;
这样可以让您执行复杂的分配,如下所示:
my ($first, $second, @rest) = @_;
所以,简而言之,问题在于您的比较看起来像这样:
if($feed_type eq "SE")
实际上是这样做的:
if(1 eq "SE")
返回假。这是真的。考虑一下这个自我记录的代码:
sub foo {
my $size = @_;
if ($size == 1) {
warn "You passed 1 argument to 'foo'\n";
return;
}
}
它演示了您无意中使用的功能。
答案 2 :(得分:1)
=用于为变量赋值,因此您需要'=='来比较字符串的数值和'eq'。
如果它抱怨不使用'==',那是因为$ feed_type不是字符串。
我无法分辨,因为没有更多的代码。无论您设置$ feed_type是什么,您需要确认它实际上包含一个字符串,或者您是否正确引用它。