Schrift
[thread]12011[/thread]

Lookup Tabelle - Kein Rückgabewert



<< >> 4 Einträge, 1 Seite
roooot
 2008-06-13 23:47
#111023 #111023
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Hallo. Ich verewende eine Lookuptabelle um verschachtelten if Bedingungen zu vermeiden.

Das sieht dann so aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
sub output {    
    
    my ($self)    = @_;
    my $outputtype = $outputtype_of{ident $self};
    
    #croak $outputtype;
    
    my $send_handler = (
        html    => do { $self->generate_html() },
        js      => do { $self->generate_js() },
        jpg     => do { $self->generate_jpg() },
        zip     => do { $self->generate_zip() },    
    );
    
    my $send_header = (
        html    => 'text/html',
        js      => 'text/javascript',
        jpg     => 'image/jpeg',
        zip     => 'archive/zip',
    );
    
    my $output = $send_handler{$outputtype}; # OUTPUT IST LEER
    
    print "Content-Type: $send_header{$outputtype} \n\n";
    print $output;
}


sub generate_html {
    
    my ($self)   = @_;
    my $template = $template_of{ident $self};     
     
    require HTML::Template;
     
    # check if page exists:
    if(!-e qq{./res/template/$template.html}) {
        croak "template not found.";    
    }
        
    my $output = HTML::Template->new(
        filename            => qq{./res/template/$template.html},
        die_on_bad_params   => 0,
    )->output();
   
    return $output;
    
}

Allerdings mein Problem: Output -> $output ist leer. Es wird aber definitiv der gewünschte Inhalt in generate_html erstellt. Wo liegt das Problem? Fehlt in der Lookup Tabelle ein return?
Viele Grüße :)
murphy
 2008-06-14 02:54
#111025 #111025
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
roooot+2008-06-13 21:47:37--
Hallo. Ich verewende eine Lookuptabelle um verschachtelten if Bedingungen zu vermeiden.


Das ist zwar eine gute Idee, allerdings solltest Du vielleicht trotzdem nicht sinnlos alle möglichen Arten von Ausgabedaten generieren, obwohl nur eine gebraucht wird:
Quote
Code (perl): (dl )
1
2
3
4
5
6
7
8
[...]
    my $send_handler = (
        html    => do { $self->generate_html() },
        js      => do { $self->generate_js() },
        jpg     => do { $self->generate_jpg() },
        zip     => do { $self->generate_zip() },    
    );
[...]


Hier wird jeder der do-Blöcke ausgewertet, ganz egal welchen Ausgabetyp Du im Endeffekt benötigst. Ich würde lieber do durch sub ersetzen.

Quote
Code (perl): (dl )
1
2
3
[...]
    my $output = $send_handler{$outputtype}; # OUTPUT IST LEER
[...]


Klar funktioniert das nicht, denn die Variable %send_handler existiert ja vermutlich gar nicht. Lokal hast Du jedenfalls nur $send_handler deklariert.

Der korrekte Zugriff wäre daher
Code (perl): (dl )
    my $output = $send_handler->{$outputtype};

beziehungsweise
Code (perl): (dl )
    my $output = $send_handler->{$outputtype}->();

für den Fall, dass Du meinen Rat annimmst, lieber anonyme Subroutinen zu speichern, die die Ausgabedaten nach Bedarf berechnen, statt immer alle Typen von Ausgabedaten direkt in dem assoziativen Array zu speichern.

Hättest Du, wie sich das gehört, strict verwendet, so wäre Dir der Fehler auch bereits beim Kompilieren des Skriptes aufgefallen.
When C++ is your hammer, every problem looks like your thumb.
roooot
 2008-06-14 13:46
#111026 #111026
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Ja das mit dem use strict war ein dummer Fehler. Ich baue mir zum ersten mal Klassen selber. Ich verwende immer use strict.
Früher habe ich immer nur mit Modulen gearbeitet wo einfach nur subroutinen drin waren. Da wurde dann doch das use strict aus dem "Main" Packet für alle vererbt und genutzt.

Aber mir ist schon klar dass der Hash noch nicht da war. Nur ich war irgendiwe zu blöd das zu sehen. Heute morgen tut mir das schon fast weh.


Danke dir trotzdem.
Viele Grüße :)
pq
 2008-06-14 15:53
#111034 #111034
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
roooot+2008-06-14 11:46:54--
Früher habe ich immer nur mit Modulen gearbeitet wo einfach nur subroutinen drin waren. Da wurde dann doch das use strict aus dem "Main" Packet für alle vererbt und genutzt.

strict gilt nie dateiübergreifend. es sollte also schon in jeder datei stehen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 4 Einträge, 1 Seite



View all threads created 2008-06-13 23:47.