Perl Can';t修改逻辑与(&;)标量赋值

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

当我使用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\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()”
    。优先级问题是
    =
    的优先级低于
    &
    。您要求读者注意的参数是多余的。