2009-12-09 3 views

Répondre

20
#!/usr/bin/env perl 
use strict; 
use warnings; 

my @array; 
open(my $fh, "<", "test.txt") 
    or die "Failed to open file: $!\n"; 
while(<$fh>) { 
    chomp; 
    push @array, $_; 
} 
close $fh; 

print join " ", @array; 
+1

+1 pour les restrictions, les handles de fichiers lexicaux et les 3 arguments 'open'. :) – Ether

+7

Vous devriez vérifier si le fichier a été ouvert avec succès. Toujours. Ou 'utiliser autodie;' –

+0

bon point. fixé! – Corey

2

L'exemple le plus basique ressemble à ceci:

#!/usr/bin/env perl 

use strict; 
use warnings; 

open(F, "<", "test.txt") or die("Cannot open test.txt: $!\n"); # (1) 
my @lines =(); 
while(<F>) { chomp; push(@lines, $_); } # (2) 
close(F); 

print "@lines"; # (3) stringify 

(1) est l'endroit où le fichier est ouvert. (2) Les poignées de fichier fonctionnent bien dans les environnements de liste (les environnements scalaires/listes sont définis par la valeur de gauche), donc si vous affectez un tableau à un descripteur de fichier, toutes les lignes sont intégrées dans le tableau. Les lignes sont délimitées (terminées) par la valeur $/, le séparateur d'enregistrement d'entrée. Si vous use English;, vous pouvez utiliser $IRS ou $INPUT_RECORD_SEPARATOR. Cette valeur par défaut est le caractère de nouvelle ligne \n;

Bien que cela semble être une bonne idée, je viens d'oublier le fait que si vous imprimez toutes les lignes, la fin \n sera également imprimée. Baaad moi.

A l'origine le code était:

my @lines = <F>; 

au lieu de la boucle while. Ceci est encore une alternative viable, mais il faut échanger (3) avec chomp ing puis impression/stringifying tous les éléments:

for (@lines) { chomp; } 
print "@lines"; 

(3) Stringifying signifie la conversion d'un tableau à une chaîne de caractères et l'insertion de la valeur $" entre les éléments du tableau. Ceci est par défaut un espace.

Voir: the perlvar page.

Ainsi, le 2ème essai réel est:

#!/usr/bin/env perl 

use strict; 
use warnings; 

open(F, "<", "test.txt") or die("Cannot open test.txt: $!\n"); # (1) 
my @lines = <F>; # (2) 
close(F); 
chomp(@lines); 

print "@lines"; # (3) stringify 
+0

Il est raccourci pour Chomp: 'Chomp (@ lignes); ' –

+0

Oh, j'ai oublié ça. Merci pour le conseil, Ivan! –

2

Encore une réponse pour vous de choisir:

#!/usr/bin/env perl 

open(FILE, "<", "test.txt") or die("Can't open file"); 
@lines = <FILE>; 
close(FILE); 
chomp(@lines); 
print join(" ", @lines); 
14

Voici mon seul paquebot:

perl -e 'chomp(@a = <>); print join(" ", @a)' test.txt 

Explication:

  • fichier en lecture par des lignes en @a réseau
  • chomp(..) - supprimer les symboles EOL pour chaque ligne
  • concaténer @a en utilisant l'espace comme séparateur
  • résultat d'impression
  • passe nom de fichier en tant que paramètre
+3

'perl -le 'chomp (@a = <>); print "@a" 'file ..' –

+0

@gbacon: Merci pour la version courte –

+0

Merci. Je n'ai jamais vu cette manière sténographique de charger et d'écraser un tableau en même temps auparavant. – Echelon

2

Si vous vous retrouvez souvent à manipuler des fichiers, vous pouvez utiliser le module File::Slurp de CP AN:

use strict; 
use warnings; 
use File::Slurp; 

my @lines = read_file('test.txt'); 
chomp @lines; 
print "@lines\n"; 
1

Ceci est la version la plus simple que je pourrais venir avec:

perl -l040 -pe';' < test.txt 

Ce qui est à peu près équivalent à:

perl -pe' 
    chomp; $\ = $/; # -l 
    $\ = 040;  # -040 
' 

et:

perl -e' 
    LINE: 
    while (<>) { 
     chomp; $\ = $/; # -l 
     $\ = " ";  # -040 
    } continue { 
     print or die "-p destination: $!\n"; 
    } 
' 
1

C'est le code qui font cela (en supposant le code ci-dessous à l'intérieur script.pl):

use strict; 
use warnings 
my @array = <> ; 
chomp @array; 
print "@array"; 

Il est géré par:

scirpt.pl [your file] 
Questions connexes