2017-06-19 4 views
-1

Je tente de raccourcir chaque ligne d'un fichier à 96 caractères tout en préservant les mots entiers. Si une ligne est inférieure ou égale à 96 caractères, je ne veux rien faire avec cette ligne. Si plus de 96 caractères, je veux le réduire au plus proche de moins de 96 tout en préservant des mots entiers. Quand j'exécute ce code, j'obtiens un fichier vide.tronquer toutes les lignes dans un fichier tout en préservant les mots entiers

use Text::Autoformat; 

use strict; 
use warnings; 

#open the file 
my $filename = $ARGV[0]; # store the 1st argument into the variable 
open my $file, '<', $filename; 
open my $fileout, '>>', $filename.96; 

my @file = <$file>; #each line of the file into an array 

while (my $line = <$file>) { 
    chomp $line; 
    foreach (@file) { 
####### 
sub truncate($$) { 
    my ($line, $max) = @_; 

    # always do nothing if already short enough 
    (length($line) <= $max) and return $line; 

    # forced to chop a word anyway 
    if ($line =~ /\s/) { 
     return substr($line, 0, $max); 
    } 
    # otherwise truncate on word boundary 
    $line =~ s/\S+$// and return $line; 

    die; # unreachable 
} 
####### 

my $truncated = &truncate($line,96); 

print $fileout "$truncated\n"; 

    } 
}  
close($file); 
close($fileout); 
+0

Pourquoi? Votre code ne l'utilise pas. Voulez-vous l'utiliser? – toolic

+0

[Text :: Wrap] (http://search.cpan.org/perldoc?Text::Wrap) – ikegami

Répondre

3

Vous n'avez aucune sortie car vous n'avez aucune entrée.

1. my @file = <$file>; #each line of the file into an array 
2. while (my $line = <$file>) { ... 

La ligne d'opération <$file> 1 est dans le contexte de la liste « consume » toutes les entrées et les charge dans @file. L'opération <$file> dans la ligne 2 n'a plus d'entrée à lire, donc la boucle while ne s'exécute pas.

Soit vous voulez diffuser du descripteur de fichier

# don't call @file = <$file> 
while (my $line = <$file>) { 
    chomp $line; 
    my $truncated = &truncate($line, 96); 
    ... 
} 

Ou lire à partir du tableau de contenu du fichier

my @file = <$file>; 
foreach my $line (@file) { 
    chomp $line; 
    my $truncated = &truncate($line, 96); 
    ... 
} 

Si l'entrée est grande, le format ancien a l'avantage de tout le chargement d'une une seule ligne en mémoire à la fois. Pourquoi `utiliser Text :: Autoformat;`?

+2

Parce que 'truncate' est un perl intégré et le' & sigil' est l'un des nombreux moyens (parce que c'est Perl) à supprime le message 'Appel ambigu résolu en CORE :: tronqué ...'. L'OP est par la présente averti [pour éviter le '&' sigil] (https://metacpan.org/pod/Perl::Critic::Policy::Subroutines::ProhibitAmpersandSigils), [pour utiliser des prototypes avec parcimonie] (https://metacpan.org/pod/Perl::Critic::Policy::Subroutines::ProhibitSubroutinePrototypes) et [ne pas utiliser les noms de sous-programmes qui sont identiques à une fonction Perl intégrée] (https://metacpan.org/pod/Perl :: Critique :: Politique :: Subroutines :: ProhibitBuiltinHomonyms). – mob