您好,我正在编写一个perl脚本来完成一些task.In我的脚本,我正在使用一个if循环来比较两个字符串,如下所示。
if($feed_type eq "SE"){
...........}上面的代码没有给我任何警告,但输出并不像我预期的那样。如果我使用'=',我得到的警告是expectng '==' but '=' is present,而不是'eq'。但是我得到了预期的输出。理想情况下,对于字符串比较,我必须使用'eq',对于数字,我必须使用'=='。在这种情况下,它不起作用。有没有人能搞清楚这里的问题是什么?
更多信息:
这个if循环出现在一个子例程中。$feed_type是该子例程的输入。我按如下方式读取输入:
my $feed_type=@_;问题已解决。我刚刚修改了feed_type的赋值语句,如下所示
my $feed_type=$_[0];它以SE的形式读取值,代码可以正常工作。但是我仍然不知道为什么my $feed_type=$_[0];不能工作。
发布于 2015-11-25 21:41:17
=可能会很好地取代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 )而不是相反的方式。
发布于 2015-11-25 23:17:20
这是关于Perl的一个核心概念:上下文。运算符和函数的工作方式因上下文而异。在这种情况下:
my $feed_type = @_;您正在将标量上下文中的数组赋值给变量。标量上下文中的数组返回其大小,而不是其中的元素。为了让这个赋值像你所期望的那样工作,你必须像你建议的那样直接访问你想要的标量值:
my $feed_type = $_[0];...or您可以通过添加括号将变量放入列表上下文中:
my ($feed_type) = @_;这样做的好处是允许您执行复杂的任务,如下所示:
my ($first, $second, @rest) = @_;所以,简而言之,问题是你的比较看起来像这样:
if($feed_type eq "SE")实际上是这样做的:
if(1 eq "SE")并返回false。这是真的。请考虑以下自文档化代码:
sub foo {
my $size = @_;
if ($size == 1) {
warn "You passed 1 argument to 'foo'\n";
return;
}
}它演示了您无意中使用的功能。
发布于 2015-11-25 21:31:13
=用于为变量赋值,因此您需要'==‘来比较数值,而'eq’用于字符串。
我不能说,因为没有更多的代码。
https://stackoverflow.com/questions/33916958
复制相似问题