首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >'=‘取代了'eq’

'=‘取代了'eq’
EN

Stack Overflow用户
提问于 2015-11-25 20:49:03
回答 3查看 105关注 0票数 0

您好,我正在编写一个perl脚本来完成一些task.In我的脚本,我正在使用一个if循环来比较两个字符串,如下所示。

代码语言:javascript
复制
if($feed_type eq "SE"){
...........}

上面的代码没有给我任何警告,但输出并不像我预期的那样。如果我使用'=',我得到的警告是expectng '==' but '=' is present,而不是'eq'。但是我得到了预期的输出。理想情况下,对于字符串比较,我必须使用'eq',对于数字,我必须使用'=='。在这种情况下,它不起作用。有没有人能搞清楚这里的问题是什么?

更多信息:

这个if循环出现在一个子例程中。$feed_type是该子例程的输入。我按如下方式读取输入:

代码语言:javascript
复制
my $feed_type=@_;

问题已解决。我刚刚修改了feed_type的赋值语句,如下所示

代码语言:javascript
复制
my $feed_type=$_[0];

它以SE的形式读取值,代码可以正常工作。但是我仍然不知道为什么my $feed_type=$_[0];不能工作。

EN

回答 3

Stack Overflow用户

发布于 2015-11-25 21:41:17

=可能会很好地取代eq,但原因并不是你想的那样。

代码语言:javascript
复制
#!/usr/bin/env perl
use strict;
use warnings;

my $test    = "fish";
my $compare = "carrot";

if ( $test = $compare ) {
    print "It worked\n";
}

当然,问题是-它总是有效的,因为您正在测试赋值操作的结果。*

*好吧,有时赋值操作不起作用-这就是为什么一些编码风格建议测试if ( 2 == $result )而不是相反的方式。

票数 4
EN

Stack Overflow用户

发布于 2015-11-25 23:17:20

这是关于Perl的一个核心概念:上下文。运算符和函数的工作方式因上下文而异。在这种情况下:

代码语言:javascript
复制
my $feed_type = @_;

您正在将标量上下文中的数组赋值给变量。标量上下文中的数组返回其大小,而不是其中的元素。为了让这个赋值像你所期望的那样工作,你必须像你建议的那样直接访问你想要的标量值:

代码语言:javascript
复制
my $feed_type = $_[0];

...or您可以通过添加括号将变量放入列表上下文中:

代码语言:javascript
复制
my ($feed_type) = @_;

这样做的好处是允许您执行复杂的任务,如下所示:

代码语言:javascript
复制
my ($first, $second, @rest) = @_;

所以,简而言之,问题是你的比较看起来像这样:

代码语言:javascript
复制
if($feed_type eq "SE")

实际上是这样做的:

代码语言:javascript
复制
if(1 eq "SE")

并返回false。这是真的。请考虑以下自文档化代码:

代码语言:javascript
复制
sub foo {
    my $size = @_;
    if ($size == 1) {
         warn "You passed 1 argument to 'foo'\n";
         return;
    }
}

它演示了您无意中使用的功能。

票数 2
EN

Stack Overflow用户

发布于 2015-11-25 21:31:13

=用于为变量赋值,因此您需要'==‘来比较数值,而'eq’用于字符串。

我不能说,因为没有更多的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33916958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档