3

当我用我正在做的 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};
}
4

5 回答 5

8

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

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

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

但实际上,它被解析为:

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

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

于 2012-04-23T15:47:43.847 回答
4

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

if (defined $user_entry && $user_entry eq 'Submitted')
于 2012-04-23T15:30:19.257 回答
3

您在这里混淆了=赋值和eq字符串等价运算符。使用(并在perlopeq中查看有关 Perl 运算符的更多信息)。将子定义放在 an内也不是一个好主意。if

于 2012-04-23T15:30:27.523 回答
3

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

if (defined $user_entry && $user_entry eq 'Submitted')
于 2012-04-23T15:33:13.670 回答
2

那么你到底想做什么?我认为您想查看是否$user_entry已定义,如果已定义,$user_entry则设置为“已提交”

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

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

并注意括号的使用!这给我们带来了另一个问题:

操作者优先

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

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

注意我使用不同样式的括号是为了查看匹配的内容。这是不好的 Perl。在 Perl 中,您只能使用(...)括号

这是因为优先顺序是:

  • 首先设置值(=操作员)
  • 那么&&运营商
  • 然后defined

做你想做的事:

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

或者,不妨将所有内容都括起来以绝对清楚:

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

我相信&&and的优先级||完全被打破了。这些操作员在 90% 的时间里根本不会做您希望他们做的事情。相反,我使用andand orwhich 完全符合我的期望:

if defined $user_entry and $user_entry eq 'Submitted ) {

这个优先顺序是:

  • defined $user_entry被检查。如果$user_entry定义...
  • $user_entry 比较'Submitted'为真
  • 最后and执行操作符

这最终给我们带来了另一件事:

始终使用use strictuse warnings

如果你use warnings;在你的程序中,你会得到这个错误:

Found = in conditional, should be == at at create_report.cgi line 105.

那会向您指出您正在尝试设置值$user_entry而不是检查相等性。

于 2012-04-23T16:00:57.983 回答