Beaucoup de problèmes.En commençant par appel à « ls | grep » :)
Commençons par un code:
Tout d'abord, obtenir la liste des fichiers:
my @files = glob('*.txt');
Mais il serait préférable de tester si la donnée nom se rapporte à un fichier ou répertoire:
my @files = grep { -f } glob('*.txt');
maintenant, nous allons ouvrir ces fichiers pour les lire:
my @fhs = map { open my $fh, '<', $_; $fh } @files;
Mais, nous avons besoin d'un moyen de gérer les erreurs - à mon avis, la meilleure façon est d'ajouter:
use autodie;
Au début du scénario (et l'installation de autodie, si vous ne l'avez pas encore). Sinon, vous pouvez:
use Fatal qw(open);
Maintenant que nous avons, nous allons obtenir la première ligne (comme vous montriez dans votre exemple) de toutes les entrées et concaténer:
my $concatenated = '';
for my $fh (@fhs) {
my $line = <$fh>;
$concatenated .= $line;
}
Ce qui est parfaitement bien, et facile à lire, mais peut encore être raccourci, tout en maintenant (à mon avis) la lisibilité, à:
my $concatenated = join '', map { scalar <$_> } @fhs;
effet est le même - concaténé $ contient les premières lignes de tous les fichiers.
Ainsi, ensemble du programme ressemblerait à ceci:
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
# use Fatal qw(open); # uncomment if you don't have autodie
my @files = grep { -f } glob('*.txt');
my @fhs = map { open my $fh, '<', $_; $fh } @files;
my $concatenated = join '', map { scalar <$_> } @fhs;
Maintenant, il se pourrait que vous voulez concaténer non seulement les premières lignes, mais tous. Dans cette situation, au lieu du code $concatenated = ...
, vous auriez besoin de quelque chose comme ceci:
my $concatenated = '';
while (my $fh = shift @fhs) {
my $line = <$fh>;
if (defined $line) {
push @fhs, $fh;
$concatenated .= $line;
} else {
close $fh;
}
}
** '' Always' ** mettre use strict; utiliser les avertissements; 'au début d'un programme Perl. Faites cela jusqu'à ce que vous sachiez exactement pourquoi vous devriez faire cela. –
"Faites cela jusqu'à ce que vous sachiez exactement pourquoi vous devriez faire cela." Et continuez à le faire à moins d'avoir une raison très précise de ne pas savoir exactement ce qui se passera à cause de cela. –