2017-10-01 17 views
3

Je suis très nouveau à Perl (juste vu une vidéo Youtube dessus). Je veux faire un script qui prend deux fichiers .csv et les ajouter ensemble et faire un nouveau fichier .csv. Je ne veux pas que les deux fichiers .csv en cours d'ajout soient modifiés. Je veux aussi faire en sorte que ce script prenne une entrée d'utilisateur en tant que fichier à fusionner (pour l'instant les deux fichiers .csv ajoutés sont dans le même répertoire). L'erreur que je reçois toujours est: print() sur le handle de fichier fermé OUT sur la ligne 1 (# 2) (W closed) Le fichier que vous imprimez s'est fermé il y a quelque temps déjà. Vérifiez votre flux de contrôleprint() sur un handle de fichier fermé OUT au

Mais je n'ai jamais utilisé la commande close alors comment se ferment mes handles de fichiers?

use strict; 
use warnings; 
use diagnostics; 
use feature 'say'; 
use feature "switch"; 
use v5.22; 

# Ask for Base File 
say "What is the base file you want to use?"; 
my $base_file = <STDIN>; 
chomp $base_file; 
open (BASE, '<', $base_file) or die "Couldn't find the base file you are entered: $base_file "; 

# Ask for Append File 
say "What is the file you want to append to the base file?"; 
my $append_file = <STDIN>; 
chomp $append_file; 
open (APPEND, '<', $append_file) or die "Couldn't find the append file you are entered: $append_file "; 

# Create new File with new name 
say "What is the name of the new file you want to create?"; 
my $new_file = <STDIN>; 
open (OUT, '>>', $new_file); 
chomp $new_file; 
while(my $base_line = <BASE>) { 
     chomp $base_line; 
     print OUT $base_line; 
} 
+0

Notes: (1) Lorsque vous utilisez 'v5.22;' les fonctionnalités 'say' et' switch' sont activées (il n'y a donc pas besoin de 'use feature ...'), tout comme 'strict' . (2) Le [changement de fonction] (https://perldoc.perl.org/feature.html#The-%27switch%27-feature) est considéré comme expérimental et il est presque certain qu'il subira des changements dans le futur. (3) Vous 'chomp $ base_line' donc il n'a pas de nouvelle ligne, puis vous« print »sans un retour à la ligne. Ainsi, toutes ces "lignes" seront une grande ligne. Si vous utilisez '' chomp' 'say' (pour ajouter une nouvelle ligne), ou mieux ne faites pas' chomp' et 'print' comme vous le faites, puisque vous ne faites que copier des lignes entières. – zdim

Répondre

4

Vous devriez vraiment vérifier si les appels à open réussir.

open(OUT, '>>', $new_file) 
    or die("Can't append to \"$new_file\": $!\n"); 

Je parie que vous vous rendrez compte que le open est un échec, je parie que vous constaterez que c'est parce que le fichier que vous avez spécifié n'existe pas, et je parie que vous constaterez que $new_file contient un saut de ligne ça ne devrait pas.

La solution est de déplacer la ligne suivante avant la open:

chomp $new_file; 

Par ailleurs, vous ne devriez pas utiliser des variables globales. Remplacez OUT par my $OUT. Idem pour BASE et APPEND.