perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 23
Click for quality!




11.02.2012 / 23:45

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragPerl Zähl Script
Seitenanfang
Hallo
ich habe hier ein Script was den Text einer Datei auslesen soll und die Buchstaben, Wörter und Zeilen zählen soll.
Allerdings zählt das Programm die erste Zeile nicht wirklich und er zählt noch Leerzeichen.
Hoffe ihr könnt mir weiterhelfen


#!/usr/bin/perl -w

print "Bitte geben sie einen Dateinamen ein.\n";
open (DATEI, <>);

@text = ();
$woerter = 0;
$buchstaben = 0;
$zeilen = 0;
$text = <DATEI>;

while (<DATEI>) {


#Wörter zählen
@textsplit = split /\s/, $text;
foreach $wort (@textsplit) {
$woerter++;
}

#Buchstaben zählen
@textsplit = split /\S/, $text;
foreach $zeichen (@textsplit) {
$buchstaben++;
}

#Zeilen zählen
@textsplit = split /\n/, $text;
foreach $zeile (@textsplit) {
$zeilen++;
}
}

print "Anzahl der Woerter: $woerter\n";
print "Anzahl der Buchstaben: $buchstaben\n";
print "Anzahl der Zeilen: $zeilen\n";

close DATEI;

exit 0;

Datum: 24.04.2009-07:59

Beitragre: Perl Zähl Script
Seitenanfang
> #!/usr/bin/perl -w
>

Als erstes solltest Du Dir angewöhnen, "use strict" zu verwenden. Das wird Dir in Zukunft viele Male eine lange Fehlersuche ersparen. Mehr findest Du unter http://wiki.perl-community.de/cgi-bin/foswiki/view/Wissensbasis/UseStrict

> print "Bitte geben sie einen Dateinamen ein.\n";
> open (DATEI, <>);

Das schreibt man sauberer so:

chomp( my $file = <STDIN> );
open my $dateihandle, '<', $file or die "Fehler: $!";

> @text = ();
> $woerter = 0;
> $buchstaben = 0;
> $zeilen = 0;
> $text = <DATEI>;
>
>
> while (<DATEI>) {
>
>
> #Wörter zählen
> @textsplit = split /\s/, $text;

Hier teilst Du die erste Zeile. In $text steckt immer nur die erste Zeile der Datei, da Du $text = <DATEI> gemacht hast. Schmeiß die erste Zuweisung raus und mach dann

while( my $text = <DATEI> ){

bzw. bei meinem "open"

while( my $text = <$dateihandle> ){

> foreach $wort (@textsplit) {
> $woerter++;
> }

Man kann das aufsummieren auch so machen:

$woerter += scalar @textsplit;

"scalar @array" gibt die Anzahl der Elemente in dem Array zurück.

> #Buchstaben zählen
> @textsplit = split /\S/, $text;
> foreach $zeichen (@textsplit) {
> $buchstaben++;
> }

Hier solltest Du vielleicht eher für jedes Wort ein split machen:

my @words = split /\s/, $text;
for my $word ( @words ){
my @wordchars = split //, $word;
$buchstaben += scalar @wordchars;
}

> #Zeilen zählen
> @textsplit = split /\n/, $text;
> foreach $zeile (@textsplit) {
> $zeilen++;
> }

Zeilen brauchst Du nicht selbst zu zählen. In Perl gibt es die Spezialvariable $. (siehe perldoc perlvar). Also kannst Du nach der while-Schleife einfach ein

$zeilen = $. + 1;

> }
>
> print "Anzahl der Woerter: $woerter\n";
> print "Anzahl der Buchstaben: $buchstaben\n";
> print "Anzahl der Zeilen: $zeilen\n";
>

Solche vielen print-Befehle würde ich nicht so aufzählen. Ich würde das so schreiben:

print qq~
Anzahl der Wörter: $woerter
Anzahl der Buchstaben: $buchstaben
Anzahl der Zeilen: $zeilen
~;

> close DATEI;
>
> exit 0;

Datum: 24.04.2009-09:02

Beitragre: Perl Zähl Script
Seitenanfang
Vielen Dank jetzt funktioniert das Programm :)

Datum: 24.04.2009-10:28

Beitragre: Perl Zähl Script
Seitenanfang
Hallo ich habe da noch eine Frage. Was genau bedeutet das hier

open my $dateihandle, '<', $file or die "Fehler: $!";

und

while( my $text = <$dateihandle> )

ich benutze Perl erst 4 Tage lang ca. und weiß noch nicht so gut bescheid :

Datum: 24.04.2009-10:56

Beitragre: Perl Zähl Script
Seitenanfang
> Hallo ich habe da noch eine Frage. Was genau
> bedeutet das hier
>
> open my $dateihandle, '<', $file or die "Fehler: $!";

Hier wird ein Dateihandle mit dem Namen $dateihandle zu der Datei $file geöffnet. Das '<' gibt an, dass die Datei lesend geöffnet werden soll.

Wenn ein Fehler auftritt (z.B. weil die Datei nicht existiert oder man keine Leserechte hat), liefert "open my $dateihandle, '<', $file" einen "unwahren" Wert zurück. Dann wird der or-Teil ausgeführt. Hier wird das Skript abgebrochen ("die") und der Fehler ausgegeben. Der Fehler steht in $!.

Lektüren:

http://p3rl.org/open
http://p3rl.org/perlvar (da steht was über $!)

> und
>
> while( my $text = <$dateihandle> )

Damit wird Text aus dem Dateihandle gelesen, solange es dort noch Text gibt.

Auch wenn das für Dich jetzt noch böhmische Dörfer sind:

Im Skalaren Kontext liefert <$dateihandle> immer einen Eintrag (hier: Zeile in der Datei) zurück. Dass es hier Skalarer Kontext ist, erkennst Du daran, dass der Rückgabewert von <$dateihandle> in einen Skalar gespeichert werden soll.

Im Listenkontext (z.B. my @lines = <$dateihandle>) werden alle Einträge (hier: alle Zeilen der Datei) zurückgeliefert.

Datum: 24.04.2009-15:38

-






-
-