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

ここに 2 つのエラーがあります。=まず、文字列等値演算子 ( ) が本当に必要な場所で代入演算子 ( ) を使用していますeq

しかし第二に、優先順位に問題があります。ブール条件を次のように解析する必要があります。

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

しかし、実際には、次のように解析されています。

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

これで、表示されているエラーが発生する理由が明確になると思います。

于 2012-04-23T15:47:43.847 に答える
4

代入演算子=を使用して の値をチェックしようとしています。Perl で 2 つの文字列を比較するため$user_entryに使用します。eq

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

=ここで代入とeq文字列等価演算子を混同しています。を使用します (およびperlopeqの Perl 演算子の詳細を参照してください)。内にサブ定義を配置することもお勧めできません。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」に設定されています

この場合、間違った演算子を使用しています。は文字列Submitted=に設定しようとしています。あなたはこれをしたい:$user_entry

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' ) ) {

と の優先順位は完全に壊れているだけ&&だと思います。||これらのオペレーターは、90% の確率で、あなたが望んでいることを実行しません。代わりに、私が期待していることを正確に実行するandandを使用します。or

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

この優先順位は次のとおりです。

  • defined $user_entryがチェックされます。定義されている場合$user_entry...
  • $user_entry が'Submitted'真と比較されます
  • 最後に、and演算子が実行されます

最後に、もう 1 つのことを説明します。

常に使用use strictし、use warnings

プログラムにあった場合use warnings;、次のエラーが発生します。

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

$user_entryそれは、等値をチェックする代わりにの値を設定しようとしていたことを指摘していたでしょう。

于 2012-04-23T16:00:57.983 に答える