Aquariophile: Perl-Ref -> Wie bekomme ich die Daten aus dem Array?? =))

Hallo!

Diese komischen referenzen in Perl machen mir grad zu schaffen....

Klaro könnte ich die Daten auch direkt in der Schleife verarbeiten, aber aus bestimmten anlass will ich das erst spaeter.

Bitte sagt mir wieso das so nicht geht wie ich das versuche.
ne besser, sagt mir bitte _wie_ es geht *g*

Danke!
Aquariophile

PS.: Data::Dumper war interessant brachte mir aber nix ;p))

==============================================================

#!/usr/bin/perl

use DBI;
use strict;

print "Content-type: text/html\n\n";

my $dbh = DBI->connect('DBI:mysql:database=foobar;host=localhost', 'user', 'passwd');
my $sth = $dbh->prepare("SELECT vorname, nachname, telephon FROM tabelle WHERE vorname LIKE ?");
$sth->execute("%");

my @array;
while (my ($vorname, $nachname, $telephon) = $sth->fetchrow_array)
{
push(@array, {vorname=>$vorname, nachname=>$nachname, telephon=>$telephon});
}

print $$array[2]{vorname};  # Vom 2. Suchergebnis der Vorname
print $$array[4]{vorname}; # Vom 4. Suchergebnis das Telephon

while(@array)
{
print $$_{vorname};
print $$_{nachname};
print $$_{telephon};
}

  1. Hallo,

    Bitte sagt mir wieso das so nicht geht wie ich das versuche.
    ne besser, sagt mir bitte _wie_ es geht *g*

    Ich denke, am besten ist, wenn Du weißt, wo Du nachlesen kannst, wie es geht:
    1.) Optimalerweise auf dem eigenen Rechner mit
      perldoc perldsc
    2.) Alternativ online unter
      http://www.perldoc.com/perl5.8.0/pod/perldsc.html

    Grüße
      Klaus

  2. #!/usr/bin/perl

    #!/usr/bin/perl -w

    Die Warnungen können helfen, gerade dann wenn man mal überhaupt nicht wieter weiss.

    use DBI;
    use strict;

    print "Content-type: text/html\n\n";

    Da du kein HMTL ausgibst, aber trotzdem eine CGI Anwendung (ist das notwendig?) schreibst, wäre hier wohl ein text/plain angebrachter.

    $sth->execute("%");

    Was macht denn das % Zeichen?

    my @array;
    while (my ($vorname, $nachname, $telephon) = $sth->fetchrow_array)
    {
    push(@array, {vorname=>$vorname, nachname=>$nachname, telephon=>$telephon});
    }

    print $$array[2]{vorname};  # Vom 2. Suchergebnis der Vorname
    print $$array[4]{vorname}; # Vom 4. Suchergebnis das Telephon

    Du benutzt doch ein Array und keine Referenz.
    print $array[index]->{vorname};  # Vom 2. Suchergebnis der Vorname

    while(@array)

    ???
    Die Referenz auf dein array dürfte immer wahr sein. Ein while erschient mir hier ungünstig, es sei denn du möchtest das array leeren:
    while(shift @array)

    Du willst (und musst in diesem Falle) eine foreach Schleife benutzen.

    {
    print $$_{vorname};
    print $$_{nachname};
    print $$_{telephon};
    }

    print $_->{vorname}. $_->{nachname} . $->{telephon} foreach(@array);

    Struppi.

  3. use Mosche;

    PS.: Data::Dumper war interessant brachte mir aber nix ;p))

    Warum? Du musst lernen zu verstehen, wie die Datenstruktur aufgebaut ist, und wie du da dran kommst. Da hilft die Data::Dumper;

    while (my ($vorname, $nachname, $telephon) = $sth->fetchrow_array)
    {
    push(@array, {vorname=>$vorname, nachname=>$nachname, telephon=>$telephon});
    }

    Wenn du so einen Hash füllst, geht auch:

    while (my $hashref = $sth->fetchrow_hashref) {
     push (@array, $hashref); # # schlüssel = spaltenname
    }

    print $$array[2]{vorname};  # Vom 2. Suchergebnis der Vorname

    Falsch: vom dritten.

    print $$array[4]{vorname}; # Vom 4. Suchergebnis das Telephon

    Falsch: vom fünften.

    use Tschoe qw(Matti);

    --
      Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
    1. Hallo,

      Wenn du so einen Hash füllst, geht auch:

      while (my $hashref = $sth->fetchrow_hashref) {
      push (@array, $hashref); # # schlüssel = spaltenname
      }

      Ich bin mir nicht sicher, aber könnte es nicht sein, daß es passieren kann, daß wenn Du Deinen Code ausführst, alle Arrayelemente auf den letzten Dtaensatz verweisen, wenn das DBI-Modul geändert wird?

      <cite source="perldoc DBI">
      Currently, a new hash reference is returned for each row. This will change in the future to return the same hash ref each time, so don't rely on the current behaviour.
      </cite>

      Grüße
        Klaus

      1. use Mosche;

        while (my $hashref = $sth->fetchrow_hashref) {
        push (@array, $hashref); # # schlüssel = spaltenname
        }

        Ich bin mir nicht sicher, aber könnte es nicht sein, daß es passieren kann, daß wenn Du Deinen Code ausführst, alle Arrayelemente auf den letzten Dtaensatz verweisen, wenn das DBI-Modul geändert wird?

        <cite source="perldoc DBI">
        Currently, a new hash reference is returned for each row. This will change in the future to return the same hash ref each time, so don't rely on the current behaviour.
        </cite>

        Möglich, ich hatte mich beim Schreiben dieses Codes auf meinen Kopf verlassen, und der ist in solchen Dingen nicht sehr zuverlässig (vor allem, weil ich _so_ noch nie gearbeitet habe, habe es nur in meinem Perl-DBI Buch irgendwann mal gelesen).

        use Tschoe qw(Matti);

        --
          Anyone who quotes me in their sig is an idiot. -- Rusty Russell.