2011-11-07 12 views
9

Considerate questo codice:Come posso trasformare un array restituito da una funzione (come split) in un riferimento di array?

@tmp = split(/\s+/, "apple banana cherry"); 
$aref = \@tmp; 

Oltre ad essere poco elegante, il codice di cui sopra è fragile. Dire che seguo con questa linea:

@tmp = split(/\s+/, "dumpling eclair fudge"); 

Ora $$aref[1] è "eclair" invece di "banana".

Come posso evitare l'uso della variabile temporanea?

Concettualmente, sto pensando a qualcosa di simile

$aref = \@{split(/\s+/, "apple banana cherry")}; 
+4

Le funzioni non possono restituire matrici. 'split' restituisce una lista di scalari, proprio come qualsiasi altro sub. – ikegami

risposta

19

Si potrebbe fare questo se si vuole un array-ref:

my $aref = [ split(/\s+/, "apple banana cherry") ]; 
3

ho capito:

$aref = [split(/\s+/, "apple banana cherry")]; 
2

Mentre mi piace la risposta di mu (e userei prima quell'approccio qui), tieni presente che le variabili possono essere piuttosto circoscritte, anche se ut l'uso di funzioni, immagini:

my $aref = do { 
    my @temp = split(/\s+/, "apple banana cherry"); 
    \@temp; 
}; 
print join("-", @$aref), "\n"; 
# with warnings: Name "main::temp" used only once: possible typo at ... 
# with strict: Global symbol "@temp" requires explicit package name at ... 
print join("-", @temp), "\n"; 

Felice codifica.

Problemi correlati