hotti: Zugriff auf Array in Hash

Beitrag lesen

hi,

das wäre bestimmt eine interessante Alternative, darf ich die mal bitte sehen?

Na klar, Du darfst das auch gerne an Deine Bedürfnisse anpassen ;-)

  
sub parseAll{  
    my @hq; # query  
    my @hi; # stdin  
    if( length($ENV{QUERY_STRING}) ){  
        push @hq, $ENV{QUERY_STRING};  
    }  
    # STDIN nur CONTENT_TYPE application/x-www-form-urlencoded  
    if($ENV{CONTENT_LENGTH}){  
        read(STDIN, my $pa, $ENV{CONTENT_LENGTH});  
        push @hi, $pa;  
    }  
    my $q = join('&', @hq, @hi);  
    # der eigentliche Parser  
    my %meta;  
    foreach my $pairs(split(/[&;]/, $q)){  
        my ($k, $v) = split('=', $pairs);  
        $v =~ tr/+/ /;  
        $v = uri_unescape($v);  
        $v =~ s/^\s+//;        # Leerzeichen am Anfang raus  
        $v = unpack "A*", $v;  # Leerzeichen und Newlines am Ende raus  
        push @{$meta{$k}}, $v;  
    }  
    return \%meta;  
}  

parseAll() wird nur einmal aufgerufen, die hashRef im return legst Du entweder auf eine globale Variable oder bindest Du an ein Objekt, hier die Objektvariante:

  
###########################################################################  
# Parameter an das URL Object anfuegen  
sub param{  
    my $self = shift; # das URL Object  
    my $key  = shift; # Schlüssel zum Parameter  
  
    # Es muss erst eine Hashreferenz erzeugt werden  
    $self->{PARAM} = parseAll() if not defined $self->{PARAM};  
  
    if($key){  
        if(not exists $self->{PARAM}{$key}){ return }  
        elsif(wantarray){ return @{$self->{PARAM}{$key}}; }  
        else{ return $self->{PARAM}{$key}->[0]; }  
    }  
    else{  
        return keys %{$self->{PARAM}};  
    }  
}  
###########################################################################  

$obj->param('feldname')

liefert Dir je nach Kontext ein Array (checkboxen oder multiple select) oder einen Einzelwert (input). Für uri_unescape() muss vorher das Modu URI::Escape eingebunden werden, schau da mal rein. Der Translater für das + Zeichen ist ein Rudiment, es gibt im URI Encoding entweder das '+' für Leerzeichen oder eine %20 Codierung, je nach Browser. Der Delimiter in der Parameterliste kann entweder das '&' oder das ';' sein, siehe Code. Praktisch ist die Entfernung der Leerzeichen am Anfang und Ende, das kannst Du halten wie Du möchtest.

Gute Nacht,
Horst Siebenschläfer (Bilch)