' ='正在努力取代' eq'

时间:2015-11-25 12:49:03

标签: perl perl-module

您好我正在编写一个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];没有工作。

3 个答案:

答案 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是什么,您需要确认它实际上包含一个字符串,或者您是否正确引用它。