我在使用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};
}
答案 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
的真相进行比较'Submitted'
运算符这终于让我们又有了一件事:
and
和use strict
如果您的程序中有use warnings
,则会出现此错误:
use warnings;
那会向你指出你试图设置Found = in conditional, should be == at at create_report.cgi line 105.
的值而不是检查相等性。