2011-03-20 2 views
0

Recherche d'une recherche non sensible à la casse en utilisant perl, donc si un "!" est détecté au début de la ligne, un nouveau tri commence (uniquement sur la section).Multple Trie dans un fichier texte

[test file] 
! Sort Section 
! 
a 
g 
r 
e 
! New Sort Section 
1 
2 
d 
3 
h 

devient,

[test file] 
! Sort Section 
! 
a 
e 
g 
r 
! New Sort Section 
1 
2 
3 
d 
h 
+0

Sur mon téléphone atm, j'avais une sorte de base allant mais n'a pas pu obtenir les sections de bits de travail – user349418

Répondre

1

Un autre, en utilisant un fichier de sortie. Plus important encore, pas le chargement d'un fichier en mémoire:

use strict; 
use warnings; 
sub output { 
    my($lines, $fh) = @_; 
    return unless @$lines; 
    print $fh shift @$lines; # print first line 
    print $fh sort { lc $a cmp lc $b } @$lines; # print rest 
    return; 
} 
# ==== main ============================================================ 
my $filename = shift or die 'filename!'; 
my $outfn = "$filename.out"; 
die "output file $outfn already exists, aborting\n" if -e $outfn; 
# prereqs okay, set up input, output and sort buffer 
open my $fh, '<', $filename or die "open $filename: $!"; 
open my $fhout, '>', $outfn or die "open $outfn: $!"; 
my $current = []; 
# process data 
while (<$fh>) { 
    if (m/^!/) { 
     output $current, $fhout; 
     $current = [ $_ ]; 
    } 
    else { 
     push @$current, $_; 
    } 
} 
output $current, $fhout; 
close $fhout; 
close $fh; 
+0

J'ai remarqué que le fichier texte formel unix devient dos formaté dans la sortie, y at-il un correctif (pour garder le format de texte original)? ..Le script est exécuté sous environnement win32, Merci pour l'effort :) – user349418

+0

Le correctif est d'appeler 'binmode' sur le handle de fichier. – Lumi

2

est ici une façon de le faire:

use strict; 
use warnings; 
my $filename = shift or die 'filename!'; 
my @sections; 
my $current; 
# input 
open my $fh, '<', $filename or die "open $filename: $!"; 
while (<$fh>) { 
    if (m/^!/) { 
     $current = [ $_ ]; 
     push @sections, $current; 
    } 
    else { 
     push @$current, $_; 
    } 
} 
close $fh; 
# output 
for (@sections) { 
    print shift @$_; # print first line 
    print sort @$_; # print rest 
} 
+0

SKIPPED l'aspect insensible à la casse. Vous pouvez fournir votre routine de tri comme suit: 'print sort {lc $ a cmp lc $ b} @ $ _; # print rest' – Lumi

+0

Est-ce que cela sauvegarde la sortie au même nom de fichier (désiré), est-ce aussi compatible win32? – user349418

+0

Il imprime les données à STDOUT, vous pouvez utiliser la redirection pour l'écrire où vous voulez. Vous pouvez également écrire le contenu dans un fichier en ajoutant un autre appel pour ouvrir/fermer un handle de fichier de sortie, en allant éventuellement jusqu'à '$ inputfilename.out'. Cependant, je vous déconseille vivement de taper sur le fichier source. Si vous voulez mettre une logique de renommage là aussi, Perl a le '' renommer '' intégré. – Lumi