2017-10-20 46 views
0

J'ai un fichier avec 10 mots aléatoires. Je peux obtenir mon script perl pour trier le fichier, mais je ne sais pas pourquoi car il trie et écrase le fichier principal. Par exemple file.txt a: "a, c, d, b" je prends lire ce nom de fichier et ensuite le trier dans un autre nom de fichier sorted.txt "a, b, c, d" Mais je ne veux pas avoir mon fichier original file.txt à changer.Tri d'un fichier avec Perl à l'aide d'un menu Shell Script

ce appelle la fonction de tri perl dans mon menu shell:

if [ "$choice" = 2 ] 
    then 
     perl perlsort.pl "$filename" 
     cp $filename $outputfilename 
fi 

Ceci est mon code perl:

my $filename = shift @ARGV; 
open(FH,$filename) or die "$!"; 
my @lines = <FH>; 
close(FH); 

$, = "\n"; 

open(my $output, ">", "$filename") or die "Unable to open $filename: $!\n"; 
print $output sort map { chomp; $_ } @lines; 
close $output; 

Répondre

3

Si vous ne voulez pas Perl pour écraser votre fichier, n » Je lui dis de le faire:

open(my $output, ">", "$filename") ouvre le nom de fichier $ pour l'écriture, c'est-à-dire l'écrase.

Peut-être spécifier un nom de fichier différent pour la sortie ou utiliser File::Temp.

BTW, cela n'a aucun sens pour envelopper $ nom entre guillemets en Perl, vous pouvez directement

open my $output, '>', $filename or die ... 

En outre, au lieu de la ligne Chomping par ligne, vous pouvez

chomp $lines; 
+0

Comme vous pouvez dire que je suis nouveau à perl :) Comment devrais-je utiliser le fichier :: Temp? – Nagne

+0

Je déteste lire les pages de manuel, mais vous pouvez toujours rechercher la documentation de File :: Temp en tapant tel dans le terminal: perldoc File :: Temp – xyz123

1

Vous avez déjà écrire le contenu trié dans un fichier dans votre code Perl. Essayez de remplacer «$ filename» par open(my $output, ">", "$filename") par le nouveau nom de fichier, de sorte que le script écrira dans le nouveau fichier au lieu de réécrire le fichier d'entrée. Avec cela, n'oubliez pas de supprimer cp $filename $outputfilename de votre script bash, sinon il remplacera le nouveau fichier par le contenu de l'ancien fichier (entrée). Ou (si $outputfilename est différent du nouveau nom de fichier dans le script perl) il créera un nouveau fichier non trié avec le nom $outputfilename et le contenu non trié, se terminant par 3 fichiers: 2 avec un contenu non trié et 1 - avec trié.