2009-09-23 21 views
9

In Perl, quale di questi è lo stile "migliore"?

$hash{"string"} or $hash{string}? 

In ogni caso, sono identiche funzionalità?

+1

In Perl, rompere le regole di stile è buono! – Artelius

+2

La prima versione funziona meglio con il codice incollato su Stack Overflow. –

+4

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. –

risposta

13

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 ;-)

+0

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 *) –

+0

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

+0

Puoi anche scrivere + funzione invece di funzione(). – jrockway

12

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.

+3

Non sono identici dal punto di vista funzionale In alcuni casi, ottieni lo stesso risultato, ma non per lo stesso motivo –

+1

La domanda era se $ hash {"stringa"} è identico a $ hash {string}, che è. –

4

Il secondo formato, $hash{string}, è più conciso, ma funziona solo per caratteri alfanumerici e caratteri di sottolineatura.

7

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

+1 perché è un argomento legittimo anche se tendo a non essere d'accordo. –

+1

Non sei d'accordo sul fatto che eviti certi trucchi? O in disaccordo per motivi di stile? Sono curioso. –

+0

che cosa significa esattamente ottenere sempre evitando? – nohat

7

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.

+0

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. –

+0

@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. –

8

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.)

0

Si dovrebbe sempre $hash{"string"} a meno che non si vuole $hash{string}.