3 Stimmen

Logische und (&&) skalare Zuweisung kann nicht geändert werden

Ich erhalte diesen Fehler unten beim Testen der Gebäude aus einer CGI-Form, die ich tue. Ich versuche zu überprüfen, ob der Benutzer Daten in das CGI-Formular eingegeben hat und ob der Wert auch übermittelt wurde. Gibt es etwas, das ich übersehe?

Herzliche Grüße,

C:\xampp\cgi-bin>perl create_report.cgi
Can't modify logical and (&&) in scalar assignment at create_report.cgi line 105
, near "'Submitted')"

Code:

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};
}

8voto

Dave Cross Punkte 65470

Sie haben hier zwei Fehler. Erstens verwenden Sie den Zuweisungsoperator ( = ), wo Sie eigentlich den String-Gleichheitsoperator ( eq ).

Aber zweitens haben Sie ein Problem mit dem Präzedenzfall. Sie möchten, dass Ihre boolesche Bedingung geparst wird als:

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

Aber eigentlich wird es geparst als:

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

Ich denke, damit ist klar, warum Sie den Fehler erhalten, den Sie gerade sehen.

4voto

Hunter McMillen Punkte 57666

Sie verwenden den Zuweisungsoperator = um zu versuchen, den Wert von $user_entry verwenden eq um zwei Zeichenketten in Perl zu vergleichen:

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

3voto

Oleg V. Volkov Punkte 20781

Sie verwechseln = Zuordnung und eq String-Äquivalenz-Operator hier. Verwenden Sie eq (und mehr über Perl-Operatoren in perlop ). Die Platzierung einer Unterdefinition innerhalb einer if ist auch keine gute Idee.

3voto

dryajov Punkte 425

Sie machen einen Auftrag statt eines Vergleichs, weil = bezeichnet in Perl eine Zuweisung, der korrekte Operator im numerischen Kontext ist == . Da Sie jedoch einen String-Vergleich durchführen, sollten Sie Folgendes verwenden eq . Siehe unten:

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

2voto

David W. Punkte 101611

Was genau versuchen Sie also zu tun? Ich nehme an, Sie wollen sehen, ob $user_entry definiert ist und wenn ja, dass $user_entry auf "Eingereicht" gesetzt ist

In diesem Fall verwenden Sie den falschen Operator. Der = versucht, die $user_entry zur Zeichenkette Eingereicht . Sie wollen dies tun:

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

Und achten Sie auf die Verwendung von Parenthesen! Das bringt uns zum anderen Thema:

Bedienergenauigkeit

Das ist eine schwierige Frage. Im Grunde genommen ist die && hat einen höheren Vorrang als der Operator defined Funktion, weil die defined Operator auf den fertigen Ausdruck wirkt. Daher wird Ihre Anweisung tatsächlich wie folgt übersetzt:

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

( ANMERKUNG : Ich verwende verschiedene Arten von Klammern, um zu sehen, was mit was übereinstimmt. Das ist schlechtes Perl. In Perl würden Sie die (...) nur in Klammern )

Dies liegt daran, dass die Rangfolge lautet:

  • Zuerst wird der Wert eingestellt (der = Betreiber)
  • Dann wird die && Betreiber
  • Dann defined

Zu tun, was Sie wollen:

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

Oder man könnte auch alles in Klammern setzen, um ganz klar zu sein:

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

Ich glaube, dass der Vorrang der && y || sind schlicht und ergreifend kaputt. Diese Operatoren tun in 90 % der Fälle einfach nicht das, was sie tun sollen. Stattdessen verwende ich and y or die genau das tun, was ich von ihnen erwarte:

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

Diese Rangfolge ist:

  • defined $user_entry geprüft wird. Wenn $user_entry definiert ist...
  • $user_entry wird verglichen mit 'Submitted' für die Wahrheit
  • Schließlich ist die and Operator ausgeführt wird

Das bringt uns schließlich zu einem weiteren Punkt:

Verwenden Sie immer use strict y use warnings

Hätten Sie use warnings; in Ihrem Programm, hätten Sie diesen Fehler erhalten:

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

Das hätte Sie darauf aufmerksam gemacht, dass Sie versuchen, den Wert von $user_entry anstatt die Gleichheit zu prüfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X