Thread Array aus HTML-Formular an CGI-Script übergeben (29 answers)
Opened by cyclohexan at 2010-01-25 11:12

Taulmarill
 2010-01-25 13:58
#131209 #131209
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
2010-01-25T12:41:26 cyclohexan
OK, wobei ich dann schon vorher wissen muss, welche Elemente das Array bzw. der Hash hat.

So wie murphy es gemacht hat, musst du das wissen. Du kannst aber auch über alle Formularfelder iterieren und entsprechend behandeln. Wenn du unbedingt ein Verhalten ähnlich wie in PHP haben willst, kannst du dir das auch selber so umbauen. Ich haben mal aus eigenem Interesse einen Anfang gemacht. Wobei ich hier keine Sicherheit garantieren will:
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
use strict;
use warnings;

use CGI;

my $cgi = new CGI;

$cgi->param( 'bla[0]', 'bla[0]' );
$cgi->param( 'bla[1]', 'bla[1]' );
$cgi->param( 'foo[\'bar\']', 'foo[\'bar\']' );
$cgi->param( 'foo[\'baz\']', 'foo[\'baz\']' );

# zum testen
$cgi->param( 'bla[\'bar\']', 'bla[\'bar\']' );
$cgi->param( 'foo[0]', 'foo[0]' );

my %form;

for my $param ( $cgi->param ) {
    my( $name, $index );
    if ( ( $name, $index ) = $param =~ /(\w+)\[(\d+)\]/ ) {
        if ( defined $form{$name} and ref $form{$name} ne 'ARRAY' ) {
            warn "$param tries to overwrite a non-array";
        }
        else {
            $form{$name}->[$index] = $cgi->param( $param );
        }
    }
    elsif ( ( $name, $index ) = $param =~ /(\w+)\[\'(\w+)\'\]/ ) {
        if ( defined $form{$name} and ref $form{$name} ne 'HASH' ) {
            warn "$param tries to overwrite a non-hash";
        }
        else {
            $form{$name}->{$index} = $cgi->param( $param );
        }
    }
    else {
        $form{$param} = $cgi->param( $param );
    }
}

use Data::Dumper;
print Dumper \%form;

Das absichern des Codes gegen Angriffe und behandeln multidimensionaler Datenstrukturen sei dem Leser als Übung überlassen ;-)
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B

View full thread Array aus HTML-Formular an CGI-Script übergeben