12
votes

Quelle est la différence entre les listes et les tableaux?

sur Cette page indique comment initialiser un tableau et si vous faites défiler un peu, sous La section appelée "Les listes" "explique" quelles listes sont et comment elles sont différentes des tableaux.

sauf qu'il utilise un exemple qui est exactement le même que de déclarer un tableau et ne l'explique pas ce que ce soit.

Quelle est la différence?


4 commentaires

Votre référence est trompeuse. Il dit un tableau est juste un ensemble de scalaires , alors qu'il y a beaucoup plus que ça


Et aussi moins que cela, comme #! Math {2, 3, 2} n'est pas un ensemble.


@ Darch: Je pense que la notion mathématique d'un Set n'est pas pertinente ici.


Je pense que cette page que vous faites référence est plutôt déroutante. "Les listes sont vraiment un type spécial de tableau" est Nonsense à mon avis. Perl a trois types de variables: scalaires, tableaux et hachages. Les listes sont exactement ce qu'elles ressemblent: une liste de scalaires. Comme si vous avez une liste de courses, une liste d'articles que vous devez acheter. Pas besoin de compliquer les choses.


8 Réponses :


8
votes

En réalité, cette question est assez bien répondue dans FAQ de Perl . Les listes sont (une des) méthodes pour organiser les données dans le code source PERL. Les tableaux sont un type de données de stockage; Les hachages sont un autre.

La différence est assez évidente ici: xxx

à première vue, il y a deux listes identiques ici. Remarque, cependant, que seule celle qui est affectée à @arr est comptée correctement par attribution scalaire. Le $ list_count stocke 1 - résultat de l'évaluation d'une expression d'évaluation avec virgade (qui nous donne essentiellement la dernière expression dans cette énumération - 1).

Notez qu'il existe une différence légère (mais très importante) entre les opérateurs de la liste et les fonctions et les arraches: les premiers sont un peu omnivores, car ils ne changent pas les données source, ces derniers ne sont pas. Par exemple, vous pouvez trancher et rejoindre votre liste en toute sécurité, comme ceci: xxx

... mais essayant de "pop", cela vous donnera un message tout à fait: xxx


8 commentaires

Donc, les tableaux sont des variables de maintien de la liste, par définition. Ils sont donc vraiment la même chose, pour toutes les préoccupations pratiques.


@aerovistae non, ils ne sont clairement pas la même chose. Les listes et les tableaux peuvent se comporter de manière assez différente (comme ci-dessus) et saisir la différence est cruciale pour écrire des perls non buggy.


Je pense que cette réponse a besoin d'une discussion sur retour @x versus retour (1, 3) avant que je ne suis tout à fait heureux, BTB.


Parler de la liste de liste n'est pas sens et trompeur. Je désapprouve.


Votre dernier exemple est gravement imparfait. Changer 4 à $ x et vous n'obtenez aucune erreur (en 5.16). Votre exemple ne montre pas ce que vous prétendez.


@Aerovistae, non, les tableaux sont des variables tenant valeurs scalaires . Vous pouvez affecter des valeurs à un tableau en vous attribuant une liste, mais ils ne tiennent pas une liste. Les listes et les tableaux ne sont pas à distance similaires, loin de "la même chose"


@Aerovistae: Les tableaux et les listes ne sont plus la "même chose" que les variables scalaires et des cordes ou des chiffres.


Revenir à cela, je veux juste dire que cet exemple est très, très loin d'être clair aux personnes qui sont nouvelles à Perl. Quoi que vous voyiez ici, il est totalement obscurci.



-1
votes

Voici ma réponse sur les sigils et le contexte

mais La principale différence est la suivante:

Les tableaux ont un Scalar-context-value comme nombre d'éléments .

listes ont un < Code> Scalar-context-Valeur Comme Dernier élément de la liste .

Donc, vous devez savoir sur Goat-Opérateur : < code> = () = .

utilisation? xxx

comme vous le voyez, = () = Changer le contexte sur tableau


0 commentaires

8
votes

Un tableau est un type de variable. Il contient 0 ou plusieurs scalaires sur des indices croissants monotoneux. Par exemple, ce qui suit crée un tableau @a code>: xxx pré>

étant des variables, vous pouvez manipuler des tableaux. Vous pouvez ajouter des éléments, modifier les valeurs des éléments, etc. p>


"Liste" signifie beaucoup de choses. Les deux utilisations principales pour il sont de faire référence à des valeurs de liste et des instances de l'opérateur de liste. P>

Une valeur de liste est une collection ordonnée de zéro ou plus de scalaires sur la pile. Par exemple, le SUB dans le code suivant renvoie une liste à attribuer à @a code> (une matrice). P>

my @c = ( @a, @b );


8 commentaires

Qu'est-ce qu'un opérateur de liste? La virgule? La virgule n'est-elle pas aussi présente dans les matrices, ainsi que des hachages?


@Aerovistae, re " Qu'est-ce qu'un opérateur de liste? ", un autre nom pour l'opérateur de la virgule. /// re " n'est-ce pas la virgule dans les tableaux aussi, ainsi que des hachages? ", quoi?


Un hachage et une matrice peuvent avoir des virgules en eux: (1, 2) ou ("clé" => "valeur", "key2" => "valeur2") . Je ne suis pas sûr de ce que mon point est plus. Soupir. Perl est différent.


Je suppose que je suppose que je pense que c'est un peu difficile de dire lorsque l'opérateur de la virgule va simplement séparer les choses et quand il va provoquer la rétablissement de la liste des derniers éléments.


@Aerovistae, ceux-ci ne sont pas des matrices ni des hachages; Les deux sont des instances de l'opérateur de la virgule (retourner la dernière valeur ou toutes les valeurs en fonction du contexte.) Les tableaux et les hachages sont des types de variables et ceux-ci ne sont pas des variables.


Donc, si ma compréhension est correcte, @a = (1,2,7); $ b = @a; aboutira à $ b étant 3 (la longueur de la matrice), tandis que $ b = (1, 2 , 7) entraînera $ B étant 7 , car l'opérateur de la virgule ne renvoie que la dernière valeur dans la liste puisque c'est un contexte scalaire. Est-ce correct?


@Aerovistae, exactement.


Merci encore d'avoir été profondément utile quand je me suis battu avec Perl il y a deux ans. Je l'ai vraiment apprécié. Vous avez donné des réponses beaucoup plus claires et moins dédaturées que quiconque ici.



9
votes

Jetez un coup d'œil à perdoc -q "Liste et un tableau" code> . La plus grande différence est qu'une matrice est une variable em>, mais tous les types de données de Perl (scalaire, tableau et hachage) peuvent fournir une liste em>, qui est simplement un ensemble commandé de scalaires.

Considérez ce code P>

my @numbers = (1, 2, 3, 4);
my @strings = qw/ aa bb cc dd /;


1 commentaires

Oh mon Dieu, c'est deux fois comme bug!



3
votes

Démonstration simple de différence.

my $a = getarray();
my $b = getlist();


0 commentaires

3
votes

Les listes sont des valeurs séparées par des virgules (CSV) ou des expressions (CST). Les matrices (et les hachages) sont des conteneurs.

On peut initialiser un tableau ou un hachage par une liste: p> xxx pré>

On peut renvoyer une liste: p>

sub f {
    return "moscow", "tel-aviv", "madrid";
}

($t1, $t2, $t3) = f();
print "$t1 $t2 $t3\n";


0 commentaires

2
votes

La différence entre les listes et les tableaux confond beaucoup. Perl lui-même a eu tort en erreur en soulagant sa fonction intégrée WANTARAYRAY () : "Cette fonction devrait avoir été nommé WeLlist () à la place. " Il y a une réponse à Perlfaq4, "Quelle est la différence entre une liste et un tableau?" , mais cela n'a pas fini ma confusion.

Je crois maintenant que celles-ci sont vraies:

  • Un tableau dans le contexte scalaire devient un nombre de ses éléments.
  • L'opérateur virgule dans le contexte scalaire retourne le dernier élément.
  • Vous ne pouvez pas faire référence à une liste; \ (2, 4, 6) renvoie une liste de références aux scalaires de la liste. Vous pouvez utiliser [2, 4, 6] pour faire une référence à un tableau anonyme.
  • Vous pouvez indexer une liste (pour obtenir son n ème élément) sans créer une matrice si vous faites une tranche de liste, donc (2, 4, 6) [1] est 4.

    Mais si je veux compter les éléments dans une liste ou obtenir le dernier élément d'un tableau? Devrais-je convertir entre les tableaux et les listes d'une manière ou d'une autre?

    Vous pouvez toujours Convertir une liste en une matrice avec [...] Syntaxe. Un moyen de compter les éléments d'une liste consiste à créer un tableau anonyme, puis à la désespectation immédiatement dans le contexte scalaire, comme: xxx

    Une autre solution consiste à utiliser la mission de liste Opérateur, comme: xxx

    Il y a aucun tableau dans ce code, mais l'opérateur d'affectation de liste renvoie le nombre d'éléments attribués. Je les attribue à une liste de variables vide. Dans le golf du code, j'écris () = $ str = ~ / reg / g pour compter les correspondances d'expression régulière dans certaines chaînes.

    Vous n'avez pas besoin convertir un tableau à une liste , car un tableau dans la liste contextuelle est déjà une liste. Si vous voulez le dernier élément d'un tableau, dites simplement $ Array [-1] .

    L'opérateur de la virgule retournerait le dernier élément d'une liste, mais je ne peux pas Utilisez-le pour obtenir le dernier élément d'un tableau. Si je dis ((), @ tableau) dans le contexte scalaire, alors @array est dans le contexte scalaire et je reçois le compte.

    Vous avez besoin Ne pas créer une matrice à index une liste . Vous pouvez créer un tableau anonyme, comme dans [liste ()] -> [1] ou vous pouvez faire une tranche de liste, comme dans (liste ()) [1] . J'ai eu des problèmes avec des tranches de liste car ils ont une syntaxe différente. Une liste des tranches a besoin de parenthèses! En C ou Python ou Ruby, Func () [1] ferait l'index de la matrice sur la valeur de retour de la fonction, mais dans Perl, Func () [1] est un erreur de syntaxe. Vous devez dire (func ()) [1] .

    Par exemple, je souhaite imprimer le 3ème numéro le plus élevé de la matrice. Parce que je suis paresseux, je trie le tableau et prenez le 3ème dernier élément: xxx

    + empêche la fonction d'impression () voler mon Parenthèses.

    Vous pouvez utiliser une tranche de liste sur un tableau, comme dans (@ tableau) [1] . Cela fonctionne car un tableau est une liste. La différence entre les listes et les tableaux est que les matrices peuvent faire $ (1] .


0 commentaires

0
votes

un tableau vs une liste

Une liste est un type de structure de données différent d'un tableau.

La plus grande différence est l'idée d'accès direct VS séquentielle. Les tableaux permettent les deux; Accès direct et séquentiel, lorsque les listes n'autorisent que l'accès séquentiel. Et c'est parce que la façon dont ces structures de données sont stockées en mémoire.

De plus, la structure de la liste ne prend pas en charge l'index numérique comme une matrice est. Et, les éléments n'ont pas besoin d'être alloués à côté de l'autre dans la mémoire comme un tableau.

tableaux

Un tableau est une collection ordonnée d'articles, où chaque élément de la matrice a un index.


1 commentaires

De toutes les tâches d'appels, une liste liée est la chose la moins probable en cours de discussion (dans un contexte Perl).