Domanda

Qual è la differenza tra i contesti scalari e l'elenco in Perl e fa questo hanno alcun parallelo in altri linguaggi come Java o Javascript?

È stato utile?

Soluzione

I vari operatori in Perl sono sensibili al contesto e producono risultati diversi in lista e scalare contesto.

Ad esempio:

my(@array) = (1, 2, 4, 8, 16);
my($first) = @array;
my(@copy1) = @array;
my @copy2  = @array;
my $count  = @array;

print "array: @array\n";
print "first: $first\n";
print "copy1: @copy1\n";
print "copy2: @copy2\n";
print "count: $count\n";

Output:

array: 1 2 4 8 16
first: 1
copy1: 1 2 4 8 16
copy2: 1 2 4 8 16
count: 5

Ora:

  • $first contiene 1 (il primo elemento della matrice), perché le parentesi nella my($first) forniscono un contesto matrice, ma c'è spazio solo per un valore $first.
  • sia @copy1 e @copy2 contengono una copia della @array,
  • e $count contiene 5 perché è un contesto scalare, e @array restituisce il numero di elementi della matrice in un contesto scalare.

esempi più elaborati potrebbero essere costruiti troppo (i risultati sono un esercizio per il lettore):

my($item1, $item2, @rest) = @array;
my(@copy3, @copy4) = @array, @array;

Non v'è alcun parallelo diretto per elencare e contesto scalare in altre lingue che conosco.

Altri suggerimenti

un contesto scalare è quello che si ottiene quando si è alla ricerca di un singolo valore. un contesto di lista è quello che si ottiene quando si è alla ricerca di valori multipli. Uno dei luoghi più comuni per vedere la distinzione è quando si lavora con gli array:

@x = @array;  # copy an array
$x = @array;  # get the number of elements in an array

Altri operatori e le funzioni sono sensibili al contesto così:

$x   = 'abc' =~ /(\w+)/;  # $x = 1
($x) = 'abc' =~ /(\w+)/;  # $x = 'abc'
@x   = localtime();       # (seconds, minutes, hours...)
$x   = localtime();       # 'Thu Dec 18 10:02:17 2008'

Come un operatore (o funzione) si comporta in un dato contesto è fino a l'operatore. Non ci sono regole generali per come le cose dovrebbero comportarsi.

È possibile rendere il proprio contesto subroutine sensibili utilizzando la funzione wantarray per determinare il contesto di chiamata. È possibile forzare un'espressione da valutare in un contesto scalare utilizzando la parola chiave scalar.

Oltre a scalari ed elencare i contesti dove si può vedere (nessun valore di ritorno del previsto) e (ci si attende un vero / falso valore) contesti "vuoto" "boolean" menzionati nella documentazione.

Questo significa semplicemente che un tipo di dati sarà valutata in base alla modalità di funzionamento. Ad esempio, un'assegnazione ad uno scalare significa lato destro verrà valutato come uno scalare.

Credo che il miglior mezzo di contesto comprensione è conoscere wantarray. Quindi immaginate che = è una subroutine che implementa wantarray:

sub = {
  return if ( ! defined wantarray ); # void: just return (doesn't make sense for =)
  return @_ if ( wantarray ); # list: return the array
  return $#_ + 1; # scalar: return the count of the @_
}

Gli esempi in questo lavoro di post come se la subroutine sopra è chiamata passando il lato destro come parametro.

Per quanto riguarda i paralleli in altre lingue, sì, ho ancora sostengono che praticamente ogni lingua sostiene qualcosa di simile. Il polimorfismo è simile in tutti i linguaggi OO. Un altro esempio, Java converte oggetti di String in determinati contesti. E ogni linguaggio di scripting senza tipo che ho usato ha concetti simili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top