Perl Can';t修改逻辑与(&;)标量赋值
当我使用CGI表单测试建筑时,我在下面得到了这个错误。我试图验证用户是否在CGI表单中输入了数据,以及是否提交了值。我有什么遗漏吗 问候,Perl Can';t修改逻辑与(&;)标量赋值,perl,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(定义的$user\u条目和$user
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(定义的$user\u条目和$user\u条目='Submitted'){
子节目表{
打印qq{\n};
打印qq{\n};
打印qq{};
打印qq{请输入您正在复制的报告的描述您正在使用赋值运算符=
尝试检查$user\u entry
的值,使用eq
比较Perl中的两个字符串:
if (defined $user_entry && $user_entry eq 'Submitted')
这里混淆了=
赋值和eq
字符串等价运算符。请使用eq
(请参阅中有关Perl运算符的更多信息)。如果
将子定义放在中也不是一个好主意。您正在进行赋值而不是比较,因为=
在Perl中表示赋值,在数值上下文中使用的正确运算符是=
。但是,您正在进行字符串比较,因此应该使用eq
。请参见下文:
if (defined $user_entry && $user_entry eq 'Submitted')
这里有两个错误。首先,您使用的是赋值运算符(=
),您真正需要的是字符串相等运算符(eq
)
但第二,您的优先级有问题。您希望将布尔条件解析为:
(defined $user) && ($entry = 'Submitted')
defined ( ( $user && $entry ) = 'Submitted')
但实际上,它被解析为:
(defined $user) && ($entry = 'Submitted')
defined ( ( $user && $entry ) = 'Submitted')
我想这就清楚了你为什么会看到错误。那么你到底想做什么呢?我想你想看看是否定义了$user\u entry
,如果是,那么$user\u entry
设置为“Submitted”
在这种情况下,您使用了错误的运算符。=
正在尝试将$user\u entry
设置为提交的字符串。要执行此操作:
if (defined $user_entry && ( $user_entry eq "Submitted" ) ) {
注意括号的使用!这就引出了另一个问题:
操作员谨慎
这是一个棘手的问题。基本上,&
运算符的优先级高于定义的
函数,因为定义的
运算符正在对完成的表达式进行操作。因此,您的语句实际上被翻译为:
if { defined [$user_entry && ($user_entry='Submitted') ] }
(注意:我使用不同样式的括号是为了查看什么与什么相匹配。这是糟糕的Perl。在Perl中,您只能使用(…)
括号)
这是因为优先顺序是:
- 首先设置值(
=
运算符)
- 然后是
&&
操作符
- 然后定义
要想做你想做的事:
if ( defined( $user_entry ) && $user_entry eq 'Submitted' )
或者,不妨将所有内容都插入括号,以便绝对清楚:
if ( defined( $user_entry ) && ( $user_entry eq 'Submitted' ) ) {
我相信&&
和|
的优先级是完全不同的。这些操作符在90%的时间里根本不做你想让他们做的事情。相反,我使用和和或来做我希望他们做的事情:
if defined $user_entry and $user_entry eq 'Submitted ) {
这一优先顺序是:
- 选中定义的$user\u条目
。如果定义了$user\u条目
$user\u条目与'Submitted'
进行比较,以了解真相
最后,执行和操作符
这最后让我们想到一件事:
始终使用使用严格
和使用警告
如果程序中有使用警告;
,则会出现以下错误:
Found = in conditional, should be == at at create_report.cgi line 105.
这会向您指出,您试图设置$user\u entry
的值,而不是检查相等性。hmm。好的,我将子主例程放在if循环的外侧;我当然也可以将子显示表单例程放在if循环的外侧。谢谢Oleg“基本上,&&运算符的优先级高于定义的函数”是不正确的。请参见perl-MO=Deparse,-p-e“defined$x&&f()”
。优先级问题是=
的优先级低于&
。您要求读者注意的参数是多余的。