2013-08-01 6 views
0

J'essaye de lire un fichier délimité par une nouvelle ligne dans un tableau en Perl. Je ne veux pas que les retours à la ligne font partie du tableau, car les éléments sont des noms de fichiers à lire plus tard. Autrement dit, chaque élément devrait être "foo" et non "foo \ n". Je l'ai fait avec succès dans le passé en utilisant les méthodes préconisées dans Stack Overflow question Read a file into an array using Perl et Newline Delimited Input.Lire un fichier délimité par une nouvelle ligne en Perl

Mon code est:

open(IN, "< test") or die ("Couldn't open"); 
@arr = <IN>; 
print("$arr[0] $arr[1]") 

Et mon dossier 'test' est:

a 
b 
c 
d 
e 

Mon résultat attendu serait:

a b 

Ma sortie réelle est:

a 
b 

Je ne vois vraiment pas ce que je fais de mal. Comment lire ces fichiers dans des tableaux?

Répondre

4

Voici comment je lis les fichiers génériquement.

open (my $in, "<", "test") or die $!; 
my @arr; 

while (my $line = <$in>) { 
    chomp $line; 
    push @arr, $line; 
} 

close ($in); 

chomp va supprimer des sauts de ligne de la ligne lire. Vous devez également utiliser la version à trois arguments de open.

0

Une option moins bavard est d'utiliser File::Slurp::read_file

my $array_ref = read_file 'test', chomp => 1, array_ref => 1; 

si, et seulement si, vous devez enregistrer la liste des noms de fichiers de toute façon.

Sinon,

my $filename = 'test'; 
open (my $fh, "<", $filename) or die "Cannot open '$filename': $!"; 

while (my $next_file = <$fh>) { 
    chomp $next_file; 
    do_something($next_file); 
} 

close ($fh); 

sauverait la mémoire de ne pas avoir à garder la liste des fichiers autour.

De même, il est peut-être préférable d'utiliser $next_file =~ s/\s+\z// plutôt que chomp, sauf si votre cas d'utilisation nécessite réellement l'utilisation d'espaces de fin dans les noms de fichiers.

0
  • Mettre le chemin du fichier dans sa propre variable afin qu'il puisse être facilement changé.
  • Utilisez le paramètre 3 arguments ouvert.
  • Testez toutes les ouvertures, imprime et ferme pour réussir, sinon, imprimez l'erreur et le nom du fichier.

Essayez:

#!/usr/bin/env perl 

use strict; 
use warnings; 

# -------------------------------------- 

use charnames qw(:full :short ); 
use English qw(-no_match_vars); # Avoids regex performance penalty 

# conditional compile DEBUGging statements 
# See http://lookatperl.blogspot.ca/2013/07/a-look-at-conditional-compiling-of.html 
use constant DEBUG => $ENV{DEBUG}; 

# -------------------------------------- 

# put file path in a variable so it can be easily changed 
my $file = 'test'; 

open my $in_fh, '<', $file or die "could not open $file: $OS_ERROR\n"; 
chomp(my @arr = <$in_fh>); 
close $in_fh or die "could not close $file: $OS_ERROR\n"; 

print "@arr[ 0 .. 1 ]\n"; 
Questions connexes