无法修改逻辑和(&& amp;)标量赋值

时间:2012-04-23 15:26:13

标签: perl

我在使用CGI表单测试构建时遇到此错误。我试图验证用户输入CGI表单中的数据以及该值是否已提交。有什么我想念的吗?

此致

C:\xampp\cgi-bin>perl create_report.cgi
Can't modify logical and (&&) in scalar assignment at create_report.cgi line 105
, near "'Submitted')"

代码:

if (defined $user_entry && $user_entry='Submitted') {
sub show_form {
    print qq{<form name="input" action="create_report.cgi" method="post">\n};
    print qq{<table align="center" border="1" bordercolor="black" cellpadding='2' cellspacing="0">\n};
    print qq{<tr>};
    print qq{<td align="right">Please enter the description of the Report you  are copying</td};
    print qq{</tr>\n};
    print qq{<tr>};
    print qq{<td align="left"><input type"text" width="7" name="spns"  value=""};
    print qq{<BR>Be sure to use just one or two words to find the report.  Like "Mortgage Summary".</td>};
    print qq{</table><center><input type="submit" value="Submitted"></center></form>\n};
}

5 个答案:

答案 0 :(得分:8)

这里有两个错误。首先,您正在使用赋值运算符(=),您真正需要字符串相等运算符(eq)。

但其次,你的优先权有问题。您希望将布尔条件解析为:

(defined $user) && ($entry = 'Submitted')

但实际上,它被解析为:

defined ( ( $user && $entry ) = 'Submitted')

我认为这清楚地说明了为什么你会收到你所看到的错误。

答案 1 :(得分:4)

您正在使用赋值运算符=尝试检查$user_entry的值,使用eq来比较Perl中的两个字符串:

if (defined $user_entry && $user_entry eq 'Submitted')

答案 2 :(得分:3)

您在此处混淆=作业和eq字符串等值运算符。使用eq(并在perlop中查看有关Perl运算符的更多信息)。将子定义放在if内也不是一个好主意。

答案 3 :(得分:3)

您正在进行赋值而不是比较,因为=表示在Perl中赋值,在数字上下文中使用的正确运算符是==。但是,您正在进行字符串比较,因此您应该使用eq。见下文:

if (defined $user_entry && $user_entry eq 'Submitted')

答案 4 :(得分:2)

那你到底想要做什么?我认为你想知道$user_entry是否被定义,如果是,$user_entry被设置为“已提交”

在这种情况下,您使用的是错误的运算符。 =正在尝试将$user_entry设置为字符串已提交。你想这样做:

if (defined $user_entry && ( $user_entry eq "Submitted" ) ) {

注意括号的使用!这将我们带到另一个问题:

操作员准确性

这是一个棘手的问题。基本上&&运算符的优先级高于defined运算符,因为defined运算符正在对已完成的表达式进行操作。因此,您的陈述实际上被翻译为:

if { defined [$user_entry && ($user_entry='Submitted') ] }

注意我使用不同类型的括号是为了查看与什么匹配的内容。这是错误的Perl。在Perl中,您将使用{{1} }仅括号

这是因为优先顺序是:

  • 首先设置值((...)运算符)
  • 然后是=运算符
  • 然后&&

做你想做的事:

defined

或者,也可以将所有内容括号括清楚:

if ( defined( $user_entry ) && $user_entry eq 'Submitted' ) 

我认为if ( defined( $user_entry ) && ( $user_entry eq 'Submitted' ) ) { &&的优先权只是简单明了。这些操作员在90%的情况下根本不做你想做的事。相反,我使用的||and完全符合我的预期:

or

此优先顺序为:

  • if defined $user_entry and $user_entry eq 'Submitted ) { 已经过检查。如果定义了defined $user_entry ...
  • $ user_entry与$user_entry的真相进行比较
  • 最后,执行'Submitted'运算符

这终于让我们又有了一件事:

始终使用anduse strict

如果您的程序中有use warnings,则会出现此错误:

use warnings;

那会向你指出你试图设置Found = in conditional, should be == at at create_report.cgi line 105. 的值而不是检查相等性。