PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : <STDIN> + Anzahl


freeze
18.08.2006, 13:57
Gibt es die Möglichkeit wenn ich Dateien per Pipe (|) übergebe, die Anzahl der Dateien zu bekommen? Also in etwa so

$count = 1;
while(<STDIN>) {
print "File " . $count . "/" . scalar(<STDIN>) . "\n";
$count++;
}


Lg freeze


mnemonic
18.08.2006, 14:32
Wenn jede Datei eine Zeile beansprucht könntest Du das so machen:
#!/usr/bin/perl -w

use strict;

my $c = 0;
while(<STDIN>) {
if(chomp() ne "") {
print("$_ "."- ".++$c."\n"); # Format: "Dateiname - Nummer"
}
}
Am Ende der Schleife hast Du dann in $c die Anzahl an Dateien (Zeilen).

freeze
18.08.2006, 15:02
so meinte ich das nicht, ich wollte die gesamtanzahl der dateien haben, bevor er die dateien durchläuft.

Da es um die 125.000 Dateien sind, würde ich das gerne vorher wissen bei welcher datei ich bin....

Datei X von insgesamt Y

so in der art. Nur wie bekomme ich aus <STDIN> die gesamtanzahl der dateien?

Lg freeze

mnemonic
18.08.2006, 15:19
Meines Wissens ist das nicht möglich.
Zu dem Zeitpunkt müsste dann ja schon alles in der Pipe gepuffert sein.

Die einzige Möglichkeit, die ich sehe, wäre das Programm von dem gepiped wird dahingehend zu ändern, dass es als erstes die Anzahl an Dateien rausschreibt.

freeze
18.08.2006, 15:29
Habs hinbekommen...


my $count = 0;
my @file_list = <>;

foreach(@file_list) {
$count++;
print "Working on file" . $count . " from " . scalar(@file_list) . "\n";

# .
# .
# DO ANYTHING
# .
# .
}


Lg freeze

mnemonic
18.08.2006, 17:08
Die Methode ist allerdings sehr Ressourcenunfreundlich, da mit Ausführung von

my @file_list = <>;

alle Deiteinamen in einem Rutsch eingelesen werden und somit im Speicher präsent sind.
Ich dachte es ging Dir darum genau das zu vermeiden... :rolleyes:

Naja, Hauptsache es funzt. :cool: