2017-05-24 2 views
0

In diesem Teil von Perl cgi-Code $ _ Variable fehlgeschlagen, um seinen Inhalt innerhalb Tag mit Perl CGI zu drucken?Subroutine nicht die Variablen innerhalb der Tag-Tag mit Perl CGI nehmen?

sub do_work { 
    my $fh = shift; 
    my $content;  

    while (my $line= <$fh>) { 
     my @name1 = grep {$_ =~ m/^\[/} $line; 
     s/\W//g for @name1; 
     $content .= join '', @name1; 
    } 

    return $content; 
} 

sub do_task { 
    my $fh = shift; 
    my $load; 
    while(my $firstline = <$fh>) { 
     $firstline =~ s/.*=//g; 
     my @words = split /,., $firstline; 
     my $add = 0; 
     $load1 .= join("\n", @words); 
    } 

    return $load1; 
} 

sub layout { 
    my ($load, @words = @_; 
    my $add = 0; 

    print << "EOF"; 
    <html><body><table> 
    <tr> 
    <th>s.no</th> 
    <th>name</th> 
    </tr> 
    EOF 

    foreach(@words) { 
     $add++; 
     print<<"EOF" 
     <tr> 
     <td>$add</td> 
     <td>$_</td> 
    EOF 
    } 

    print <<"EOF" 
    </table></body></html> 
    EOF 
} 

Beschreibung:

  1. die @words Um wieder zu lesen und wieder hatte ich früher foreach loop.Here @words werden aus der vorherigen Unterprogramm gelesen. Ich habe versucht, den gleichen Array-Inhalt in das Tag zu laden. Aber von meinem Code geht es nicht in die foreach? Wegen welchem ​​Fehler es seinen Inhalt nicht lädt.

Erwartete Ausgabe:

Von load1 $ bekam es die folgende Ausgabe:

hardware 
software 
os 

Also versuchte ich es in Tabelle innerhalb Tag also zu drucken, so dass ich die foreach-Schleife Standard nehmen verwendet hatte Wert. Jetzt

erwarte ich meine Ausgabe sollte wie folgt lauten:

s.no name 
1  Hardware 
2  Software 
3  os 
+1

Dies ist nicht Ihr richtiger Code. Es hat Syntaxfehler. Bitte geben Sie Ihren ** echten Code ** an! Und während Sie dabei sind, fügen Sie bitte auch Beispieldaten hinzu, um das Problem zu reproduzieren und zu erklären, welche Ausgabe Sie erwarten. – simbabque

+0

realer Code ist zu groß das ist, warum ich den Teil des Codes hinzugefügt hatte, wo es Problem zeigt. @simbabque –

+0

hinzugefügt erwartete Ausgabe. @simbabque –

Antwort

1

Der EOF Marker für die HEREDOC den ganzen Weg auf der linken Seite sein muss. Es darf keine führenden Leerzeichen enthalten. Aus diesem Grund sollte ein Syntaxfehler auftreten, da der restliche Code vom Parser nicht als Code erkannt wird.

Es sollte so aussehen.

sub layout 
{ 

    my($load)[email protected]_; 
    my @[email protected]_; 
    my $add=0; 
    print << "EOF"; 
    <html><body><table> 
    <tr> 
    <th>s.no</th> 
    </tr> 
EOF 

    foreach(@words) 
    { 
    $add++; 
    print<<"EOF" 
    <tr> 
    <td>$add</td> 
    <td>$_</td> 
EOF 

    } 
    print <<"EOF" 
    </table></body></html> 
EOF 

} 

Eingerückte HEREDOCs werden wahrscheinlich mit Perl 5.26 verfügbar sein. Ein neues Feature wurde mit der Entwicklungsversion 5.25.7 veröffentlicht, die die neue Syntax <<~"EOF" einführt. Aber Sie haben wahrscheinlich diese oder eine neuere Version nicht.


Zusätzlich zu dem, setzen Sie das erste Argument der Funktion in $load, sondern auch in @words. Das ist wahrscheinlich falsch. Das sollte my ($load, @words) = @_ sein.

+0

Nach der Einrückung finde ich das gleiche [email protected] –

+0

hinzugefügt erwartete Ausgabe @simbabque –

+0

warum die nicht innerhalb der foreach-Schleife @simbabque –

Verwandte Themen