Comment puis-je créer un tableau à deux dimensions en Perl?
Je suis en train d'essayer de transmettre un fichier de matrice de 32 de 48 à un tableau multidimensionnel en Perl. Je suis en mesure d'accéder à toutes les valeurs, mais elle éprouve des difficultés d'accès à une valeur spécifique. Toute aide serait grandement appréciée. J'ai mis un lien vers l'ensemble de données ainsi que le code que j'ai ci-dessous.
Voici un lien vers l'ensemble de données:
http://paste-it.net/public/x1d5301/
Voici ce que j'ai pour le code de la droite maintenant.
#!/usr/bin/perl
open FILE, "testset.txt" or die $!;
my @lines = <FILE>;
my $size = scalar @lines;
my @matrix = (1 .. 32);
my $i = 0;
my $j = 0;
my @micro;
foreach ($matrix)
{
foreach ($lines)
{
push @{ $micro[$matrix]}, $lines;
}
}
- lol pour
use English;
- juste se poser la question et coupé de tout le reste.
- J'ai supprimé l'utilisation de l'anglais
Vous devez vous connecter pour publier un commentaire.
Il ne semble pas vous comprendre que
$matrix
indique seulement@matrix
quand il est immédiatement suivi par un tableau de l'indexeur:[ $slot ]
. Sinon,$matrix
est totalement différente de la variable@matrix
(et à la fois différent de%matrix
ainsi). Voir perldata.Ne pas! utiliser l'anglais--de cette façon!
Cela apporte de la
$MATCH
,$PREMATCH
, et$POSTMATCH
et incurrs la redoutable$&
, $`,$'
peine. Vous devez attendre jusqu'à ce que vous êtes à l'aide de un anglais variable et ensuite il suffit de les importer.Deux choses: 1) l'utilisation lexicale descripteurs de fichiers, et 2) utiliser les trois-arg
ouvrir
.Tant que je suis la cueillette: Ne pas siphonner les gros fichiers. (Pas le cas ici, mais c'est un bon avertissement.)
Je vois que nous en sommes à la "Le PROFIT!!" scène ici...
Vous n'avez pas une variable
$matrix
vous disposez d'une variable@matrix
.Même chose est vraie avec
$lines
.De réécriture:
split
sans arguments estsplit ' '
passplit /\s+/
split ' '
, passplit /\s+/
. Les deux diffèrent dans la façon dont les espaces sont traités.split( ' ' )
était il ne serait fendu d'un seul espace de caractères--je n'ai vraiment utiliser le raccourci de ces fonctions dans le jouet code que j'écris sur DONC. Vous avez raison, @Sinan t omettre la première chaîne de longueur nulle. Mon mauvais. Et apparemment, c'est simplement pour se conformer à laawk
.split()
se comporte plus commesplit( /\s+/ )
qu'il nesplit( $char )
avec$char = ' '
ou$char = ','
. Le' '
en fait cache la gamme complète de fractionnement du comportement.Si vous allez faire un peu de maths, vous pourriez envisager de PDL (Perl Données de la Langue). Vous pouvez facilement configurer votre matrice et avant les opérations sur elle:
La sortie montre la matrice d'évolution:
Il est tout à fait un peu de puissance pour faire fonctionner l'arbitraire et de la complexité des opérations sur chaque membre de la matrice, tout comme j'ai ajouté 1 à chaque membre. Vous avez complètement ignorer la boucle de l'acrobatie.
Non seulement cela, PDL n'est pas mal de trucs à faire des maths très vite et d'avoir une faible empreinte mémoire. Certaines des choses que vous voulez faire peut-être déjà mis en œuvre.
Vous avez probablement besoin de
chomp
les valeurs:Je vais faire de la CW, car son seul but est de clarifier un point tangentiel j'ai fait dans mon commentaire à @Armé d'une hache de réponse. Voir perldoc -f split:
De sortie:
Je vois que la question est assez vieux, mais comme l'auteur a publié la question, c'est peut-être encore de l'intérêt. Aussi le lien vers les données sont morts, mais depuis d'autres réponses d'utiliser l'espace comme séparateur, moi aussi.
Cette réponse démontre
Tie::Array::CSV
qui permet l'accès aléatoire à un fichier CSV (ou un autre fichier analysée avecText::CSV
).