Pour démontrer le mantra perlienne qu'il ya "plus d'une façon de le faire":
use 5.10.0; # so can use "say"
use strict;
use warnings qw(all);
sub get_data {
my ($cols, $rows) = @_;
my ($line, @rows);
my $i;
for ($i = 1; $i <= $rows and $line = <DATA>; $i++) {
chomp $line;
my $cells = [ split ' ', $line ];
die "Row $i had ", scalar(@$cells), " instead of $cols" if @$cells != $cols;
push @rows, $cells;
}
die "Not enough rows, got ", $i - 1, "\n" if $i != $rows + 1;
\@rows;
}
sub print_data {
my ($cols, $rows, $data) = @_;
for (my $i = 0; $i < $rows; $i++) {
for (my $j = 0; $j < $cols; $j++) {
say $data->[$i][$j];
}
}
}
my $data = get_data(6, 6);
print_data(6, 6, $data);
__DATA__
1 2 3 4 5 6
a b c d e f
6 5 4 3 2 1
f e d c b a
A B C D E F
7 8 9 10 11 12
Explication:
- si nous utilisons
say
, cela évite les disgracieux print ..., "\n"
get_data
est une fonction qui peut être appelée et/ou réutilisée, dans lieu de simplement faire partie du script principal
get_data
sait quelles données il forme et attend renvoie une erreur si elle ne reçoit pas
[ ... ]
crée un tableau anonyme et renvoie une référence à ce
get_data
retours une matrice de référence de sorte que les données ne sont pas copiées
print_data
est une fonction trop
- les deux fonctions utilisent une boucle
for
classique au lieu de faire des listes de numéros, ce qui en Perl 5 a besoin d'allouer de la mémoire
Il existe également une version à deux lignes du programme (avec les bits environnants, et les données de test):
use 5.10.0; # so can use "say"
my @lines = map { [ split ' ', <DATA> ] } (1..6);
map { say join ' ', map qq{"$_"}, @$_ } @lines;
__DATA__
1 2 3 4 5 6
a b c d e f
6 5 4 3 2 1
f e d c b a
A B C D E F
7 8 9 10 11 12
Explication:
- utilisant
map
est le moyen premier à itérer sur les listes des choses où vous n'avez pas besoin de savoir combien vous avez vu (sinon, une boucle for
est nécessaire)
- l'ajout de
"
autour du contenu de la cellule est seulement de prouver qu'ils ont été traités. Sinon, la deuxième ligne pourrait être: map { say join ' ', @$_ } @lines;
Toujours utiliser 'use strict; utiliser les avertissements qw (tous); – ikegami