In Perl, quale di questi è lo stile "migliore"?
$hash{"string"} or $hash{string}?
In ogni caso, sono identiche funzionalità?
In Perl, quale di questi è lo stile "migliore"?
$hash{"string"} or $hash{string}?
In ogni caso, sono identiche funzionalità?
Da perldata perldoc:
In realtà, un identificatore all'interno di tali graffe è costretto ad essere una stringa, così come qualsiasi semplice identificatore all'interno di un indice di hash. Né bisogno di quotare. Il nostro precedente esempio,
$days{'Feb'}
può essere scritto come$days{Feb}
e le virgolette verranno automaticamente considerate. Ma qualsiasi cosa più complicata nel pedice verrà interpretata come un'espressione. Ciò significa ad esempio che$version{2.0}++
è equivalente a$version{2}++
, non$version{'2.0'}++
Quindi sì fondamentalmente identica. Ma attenzione ai trucchi:
sub is_sub { 'Yep!' }
my %hash;
$hash{ is_sub } = 'Nope';
$hash{ is_sub() } = 'it is_sub!!';
say Dumper \%hash;
mostrerà:
$VAR1 = { 'is_sub' => 'Nope', 'Yep!' => 'it is_sub!!' };
La mia preferenza è per la bareword ... ma ricordate quelli() o + precedente (vedi commento e la risposta di jrockway) se si' ri chiamando un sub ;-)
Il tuo esempio riguardante '$ version {2.0}' vs. '$ version {'2.0'}' mi confonde considerando questo: 'perl -e '$ foo { '2.0'} = 1; stampa $ pippo {'2'} ++, $ pippo {2} ++, $ pippo {2.0} ++, $ pippo {1 + 1} ++, "\ n"; ' ' Il valore nelle parentesi viene valutato in uno scalare e quello scalare viene utilizzato come chiave. Quindi devo presumere che non hai testato il tuo esempio o che mi manca qualcosa di sottile in quello che stai provando dire. (Per me stampa * 1234 *) –
Sfortunatamente il tuo esempio non è corretto. In realtà sono sorpreso che abbia anche analizzato OK. Usiamo virgolette singole su -e e nell'indice hash. Ad ogni modo se controlli i tuoi valori hash $ foo dopo le impostazioni ottieni {'2.0' => 1, '2' => 4} ... che è la risposta che ti aspetteresti di vedere – draegtun
Puoi anche scrivere + funzione invece di funzione(). – jrockway
Sono funzionalmente identici, cioè finché la chiave non ha uno spazio o qualche altro carattere non alfanumerico. Quindi devi usare l'approccio quotato.
Preferisco non citare e utilizzare nomi che contengono alpha_num e il carattere di sottolineatura. Questo mi permette di farla franca senza citare la maggior parte del tempo.
Non sono identici dal punto di vista funzionale In alcuni casi, ottieni lo stesso risultato, ma non per lo stesso motivo –
La domanda era se $ hash {"stringa"} è identico a $ hash {string}, che è. –
Il secondo formato, $hash{string}
, è più conciso, ma funziona solo per caratteri alfanumerici e caratteri di sottolineatura.
Fuori dalla pedanteria, cito sempre i miei riferimenti di stringa in un hash. Serve a garantire che non avrò un getcha [1].
[1] Sono piuttosto prudente nella mia codifica Perl.
+1 perché è un argomento legittimo anche se tendo a non essere d'accordo. –
Non sei d'accordo sul fatto che eviti certi trucchi? O in disaccordo per motivi di stile? Sono curioso. –
che cosa significa esattamente ottenere sempre evitando? – nohat
Il modulo senza virgolette è preferito dalla maggior parte, perché è più conciso e non ingombrante, purché la chiave hash sia limitata agli alfanumerici e al trattino basso. Inoltre, la maggior parte degli editor con supporto per sintassi Perl sa come evidenziarli come stringhe nonostante non siano tra virgolette.
Si noti che è possibile ottenere questo comportamento non solo quando si utilizzano le chiavi hash, ma quando si definiscono gli hash, si passano gli argomenti o anche quando si definiscono gli elenchi quando si utilizza =>
. Può aiutare a distinguere visivamente le tue chiavi dai tuoi valori nei primi due casi. Esempi:
# Hash construction
my %hash = (
key1 => "val1",
key2 => "val2"
);
# Subroutine arguments
some_function(arg1 => "val1", arg2 => $val2);
sub some_function { my %args = @_; }; # arguments are pulled in as a hash
# List construction (of course, not sure why you'd do this...)
my @list = (Foo => "bar");
print @list; # prints Foobar
Detto questo, ho iniziato citando tutto ed è stato un un'abitudine difficile da interrompere. In qualche modo sembra "più sicuro" citare le tue chiavi di hash, anche dopo tutti questi anni.
Meno errori inclini? Ho visto più errori di persone che non usano le virgolette piuttosto che usarle. Vedi la risposta di draegtun per alcuni esempi. –
@brian: Sì, i due esempi forniti sono buoni, ma non esattamente oscuri. Un periodo è al di fuori del set alfanum + trattino basso, quindi è facile da catturare. Personalmente, ho anche l'abitudine di usare sempre i parens con metodi definiti dall'utente, quindi anche il secondo modulo non mi prende. Tuttavia, mi inchino alla tua esperienza superiore e ho rimosso quella frase dalla mia risposta. –
Evitare le virgolette è più idiomatico.
Modifica per aggiungere:
Citando non è la soluzione ai leggibilità assoluta.Si consideri l'incoerenza qui:
sub function() { 'OH HAI' }
my @list = ('foo', 'bar', function);
# ==> ('foo', 'bar', 'OH HAI')
my %hash;
$hash{'foo'} = 1;
$hash{'bar'} = 2;
$hash{function} = 3;
# ==> { foo => 1, bar => 2, function => 3 } (oops)
Quando mai citare le stringhe, le cose "strano" sono visivamente diversa dalle stringhe semplici ... ed è analizzati correttamente.
$hash{foo} = 1;
$hash{bar} = 2;
$hash{+function} = 3; # aha, this looks different... because it is
# ==> { foo => 1, bar => 2, 'OH HAI' => 3 }
(sintassi di Stack Overflow evidenziando pasticci questo in su, in modo da cercare di ignorarlo.)
Si dovrebbe sempre $hash{"string"}
a meno che non si vuole $hash{string}
.
In Perl, rompere le regole di stile è buono! – Artelius
La prima versione funziona meglio con il codice incollato su Stack Overflow. –
Perché ti importa? Veramente. Sicuramente ci devono essere cose migliori di cui preoccuparsi nel tuo codice. Non mi interessa quale delle persone usi finché le loro cose funzionano. –