2010-09-30 3 views
1

me semble me rappeler (mais ne peut trouver aucune référence maintenant) à un être capable de faire quelque chose de semblable àComment puis-je accéder aux valeurs dans un tableau Perl 2-D pour les avoir dans des variables scalaires?

my @a = ("foo","bar"); 
my ($item1, $item2) = @a; 

Ce qui précède ne pas ce que je veux qu'il (évidemment) mais il me semble rappeler qu'il existe un moyen de le faire, où il charge les éléments associés à l'ordre des scalaires dans la liste entre parenthèses.

Pour cette question, je pensais que ce comment le tableau args est passé dans les sous-routines, comme dans ...

sub method{ 
    my ($arg1, $arg2) = @_; 
} 

Peut-être que je vais juste sortir de mon esprit, mais je pensais que cela était possible.

[EDIT]

Ah ... donc basée sur la première réponse que je me rends compte que la raison pour laquelle il ne fonctionne pas est que j'utilise un tableau à deux dimensions. Donc, dans mon code, il ressemble vraiment à ceci:

foreach(@twoDimenArray){ 
    my ($item1, $item2, $item3) = $_; #$_ is an array 
} 

Il doit être la syntaxe $ qui est la vissant mais j'ai essayé ($_) and @($_) and @$_ et aucun de ces travaux.

+4

Cela devrait fonctionner, peut vous envoyer un exemple cela ne fonctionne pas pour vous avec ce que vous attendiez de lui. –

+0

Comment votre tableau 2D est-il créé? –

+0

Je le crée lors de la lecture de lignes à partir de DBI, mais il peut s'agir d'un tableau à deux dimensions. –

Répondre

6

Essayez d'utiliser @{$_}:

foreach (@twoDimenArray) { 
    my ($item1, $item2, $item3) = @{$_}; # $_ is an array 
} 
4

Ce que vous avez des œuvres pour moi - c'est, cette impression "foo bar":

use strict; 
use warnings; 

my @a = ("foo","bar"); 
my ($item1, $item2) = @a; 

print "$item1 $item2\n"; 

J'arrive d'utiliser Perl 5.13.4 sur MacOS X 10.6.4, mais je ne pense pas c'est un facteur important; Je m'attendrais à tout Perl 5.x à l'accepter.


Ce code implémente un tableau 2D:

use strict; 
use warnings; 

my @a; 

$a[0][0] = "a00"; 
$a[0][1] = "a01"; 
$a[1][0] = "a10"; 
$a[1][1] = "a11"; 

my ($item1, $item2) = @a; 

print "$item1 $item2\n"; 

La sortie est 'deux refs ARRAY':

ARRAY(0x100803068) ARRAY(0x100826770) 

main gauche, je ne sais pas d'un moyen de Développez le tableau de tableaux en 4 valeurs distinctes en une seule opération. Ce n'est pas tout à fait la même chose que «il n'y a pas moyen de le faire».


Et, la mise en œuvre de votre boucle foreach:

foreach my $array (@a) 
{ 
    my($item1, $item2) = @$array; 
    print "$item1 $item2\n"; 
} 

Cette impression:

a00 a01 
a10 a11 

Ce code est un exemple de la distribution DBD :: Informix - Dernière modification en 2002. Il utilise la méthode fetchall_arrayref() qui renvoie un tableau de références de tableau, en tant qu'hommes dans l'un des commentaires à la question.

#!/usr/bin/perl -w 
# 
# DBD::Informix Example 5 - fetchall_arrayref 
# 
# @(#)$Id: x05fetchall_arrayref.pl,v 100.1 2002/02/08 22:50:10 jleffler Exp $ 
# 
# Copyright 1998 Jonathan Leffler 
# Copyright 2000 Informix Software Inc 
# Copyright 2002 IBM 

use DBI; 
printf("DEMO1 Sample DBD::Informix Program running.\n"); 
printf("Variant 4: using fetchall_arrayref()\n"); 
my($dbh) = DBI->connect("DBI:Informix:stores7") or die; 
my($sth) = $dbh->prepare(q% 
     SELECT fname, lname FROM customer WHERE lname < 'C'%) or die; 
$sth->execute() or die; 
my($ref) = $sth->fetchall_arrayref(); 
foreach $row (@$ref) 
{ 
    printf("%s %s\n", $$row[0], $$row[1]); 
} 
undef $sth; 
$dbh->disconnect(); 
printf("\nDEMO1 Sample Program over.\n\n"); 

Y avait-je en train d'écrire maintenant (ou sa mise à jour), il y aurait utiliser use strict; ainsi que le -w (équivalent à use warnings;). Il montre qu'en 2002 (et depuis, AFAIK), vous pourriez écrire @$ref heureusement assez. Ces jours-ci, j'écrirais probablement les références $$row[0] différemment - comme ${$row}[0].

+0

C'est bizarre il y a une minute, quelqu'un (Cameron, je pense) a posté la bonne réponse dans un commentaire, puis l'a supprimé. Quoi qu'il en soit ... laissez-le perl pour rendre les choses imprévisibles. La réponse est ($ a, $ b, $ c) = @ {$ _} –

+1

Les commentaires une fois supprimés sont perdus pour toujours, AFAIK. Avec de la chance, la troisième édition de cette réponse vous donne aussi la «bonne réponse». Et, AFAIK, @ $ x et @ {$ x} sont équivalents. –

+1

Hé ... J'ai supprimé ce commentaire parce que je l'ai essayé à l'invite de commande mais je n'ai pas réussi à le faire fonctionner. Mon test de doublure était probablement imparfait. Je pourrais ajouter le commentaire si vous aimez ;-) – Cameron

0

Pour un tableau de refs tableau:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @ary = ([ qw(foo bar) ], [ qw(one two) ],); 

my ($ary00, $ary01, $ary10, $ary11) = map { @{ $_ } } @ary; 

Pour les tableaux arbitrairement imbriquées:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @ary = (
    [ 
     qw(foo bar), 
     [ 
      qw(BAZ QUUX) 
     ], 
    ], 
    [ 
     qw(ten eleven), 
     [ 
      'one hundred and twenty', 
      'one hundred and twenty-one', 
      [ 
       'one thousand two hundred and twenty', 
       'one thousand two hundred and twenty-one', 
      ], 
     ], 
    ], 
); 

sub flatten { 
    my @ary = @_; 
    return map { ref($_) eq 'ARRAY' ? flatten(@{ $_ }) : @{ $_ } } @ary; 
} 

my ($a00, $a01, $a020, $a021, $a10, $a11, $a120, $a121, $a1220, $a1221) = flatten @a; 
Questions connexes