Come posso ottenere un lavoro dati :: Alias ??in Perl 5.12?
-
03-10-2019 - |
Domanda
Data::Alias
. Sembra essere rotto in 5.12. Può essere fisso? Sarà risolto al più presto? C'è qualche bella alternativa?
Soluzione
Qualsiasi versione di Data::Alias
costruito prima versione 1.08 (Rilasciato 22 Ottobre 2010 BST) non funziona con Perl 5.12 da Data::Alias
prima di 1.08 è rotto in Perl 5.12. Aggiornamento alla versione più recente (1.08 o più recente) e dovrebbe funzionare!
Come nota a margine interessante, sembra essere in grado di fare gli alias possono essere venuta a Perl come caratteristica del linguaggio, in futuro, con la pulizia di :=
non è più il che significa una lista di attributi vuota . Non vedere l'ora! :)
Altri suggerimenti
Il modulo non è stato aggiornato dal 2007, ma si può sempre inviare un messaggio all'autore (Matthijs van Duin: xmath@cpan.org). O una segnalazione di bug come Robert menzionato nella sua risposta ??p>
Ecco alcune alternative:
-
Per quanto riguarda i moduli CPAN aggiuntivi per aliasing che il lavoro in 5.12 +:
- variabile :: Alias ?? - sintassi pulita ??li>
- Tie :: Alias ?? - una soluzione perl puro
- lessicale :: Alias ?? - sintassi pulita ??li>
- Devel :: LexAlias ?? - un livello inferiore po '
E alla ricerca di 'alias' su CPAN salta fuori un paio di più, nessuno sembra fornire il "fare tutto con gli alias in questa affermazione" caratteristica di dati :: Alias ??però. Così fino a quando è fisso
Data::Alias
, è possibile utilizzare uno di quanto sopra, o i seguenti metodi Perl puro: -
Perl ha un supporto incorporato per aliasing qualsiasi variabile alle variabili che esistono nella tabella dei simboli. Questo viene fatto nel seguente modo:
my $x = 1; our $y; # declare $y in the symbol table for the current package { local *y = \$x; # make $y an alias of $x in the current scope $y++; } print $x; # prints 2
Ma, come sempre, essere consapevoli di ciò che scope dinamico / locale in realtà lo fa prima di utilizzarlo.
-
A lessicale scalare può essere utilizzato come alias nell'ambito di un ciclo:
my $x = 1; for my $y ($x) { $y++; } print $x; # prints 2
questo tipo di alias lessicale può anche essere passato dal ciclo in una chiusura se necessario
-
È possibile creare alias matrice usando la magia aliasing del Perl per le liste di argomenti di subroutine:
my $x = 1; my $alias = sub{\@_}->($x); # return a reference to its argument list, # which maintains its aliases $$alias[0]++; print $x; # prints 2
, ma che in realtà non vi darà più funzionalità rispetto riferimenti, solo con una sintassi diversa.
-
E un esempio utilizzando i riferimenti del Perl:
my $x = 1; my $y = \$x; # take a reference to $x $$y++; # dereference $y print $x; # prints 2
Ho appena trovato un altro potenziale opzione: Scalar::Alias
, che sembra funzionare in Perl 5.12. Ovviamente, solo alias scalari, ma non richiede una virgola grasso al posto di un segno di uguale.