Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Perl/CGI » Zeilennummern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
09.02.2007, 14:14 Uhr
~Alfredo
Gast


Hallo zusammen,

ich lese mit folgendem Programm die Zeilen einer Datei ein.


Code:
#!/usr/bin/perl

# open the file
$file = '/cygdrive/d/Perl/passwd';
open(FILE_HANDLE, $file);

# read the file line per line
while ($line = <FILE_HANDLE>)
  {
# TODO: how to print 001, 002, 003, ... 009, 010, 011, ...  before each line
    print $line;
  }

# close the file
close(FILE_HANDLE);



Wie kann ich aber nun vor jeder Zeile eine Zeilennummer der Form 001, 002, ... einfügen?

Ich habe gelesen, dass dies mit Perl sehr einfach gehen soll. Leider habe ich keine Ahnung wie.

Bin für jeden Hinweis dankbar.

Gruß
Alfredo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.02.2007, 14:52 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)



Code:
#!/usr/bin/perl
use strict;
use warnings;

my $file = '/cygdrive/d/Perl/passwd';
my $counter = 000;
open(FILE_HANDLE, "<", $file) || die "Error: $!";

# read the file line per line
while (<FILE_HANDLE>)
{
    print $counter++ . ": " . $_;
}

close(FILE_HANDLE);

Nicht getestet aber so in etwa. Du musst einfach mitzählen
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.02.2007, 15:30 Uhr
~Alfredo
Gast


Danke, ist aber nicht genau, was ich wollte. Diese Variante hätte ich hinbekommen.

Ich möchte nicht 0, 1, 2 ,3 ...
sondern 000, 001, 002, ... , 009, 010, ...

Und ich wußte nicht, wie ich diese Formatierung hinbekommen kann. Es soll sehr leicht gehen. Leider weiß ich nicht wie.

Danke schonmal

Alfredo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.02.2007, 20:16 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Mit sprintf - wieder nicht getestet

Code:
#!/usr/bin/perl
use strict;
use warnings;

my $file = '/cygdrive/d/Perl/passwd';
my $counter = 000;
open(FILE_HANDLE, "<", $file) || die "Error: $!";

# read the file line per line
while (<FILE_HANDLE>)
{
    my $formatstring = length(++$counter) == 1 ? "00" : length($counter) == 2 ? "0" : "";
    print sprintf($formatstring."%d", $counter) . ": " . $_;
}

close(FILE_HANDLE);

--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 09.02.2007 um 20:16 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.02.2007, 21:21 Uhr
Bruder Leif
dances with systems
(Operator)


Kann Perl nicht auch das hier?


Code:
sprintf("%3.3d", $counter++)


--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.02.2007, 21:44 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Hmm... Mein Fehler
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.02.2007, 11:26 Uhr
~Alfredo
Gast


Danke. Klappt super mit der sprintf-Lösung.
Nun interessiere ich mich natürlich für die sprintf-Funktion. Gibt es eine Seite im Netz, die alle Formatierungsmöglichkeiten von sprintf mit Beispielen auflistet?

Gruß
Alfredo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.02.2007, 12:11 Uhr
~Alfredo
Gast


Hallo zusammen,

nun habe ich das nächste Problem. Ich wollte das Programm nun so umschreiben, dass Leerzeilen zwar ausgegeben, aber nicht mitgezählt werden.
Dazu habe ich mir eine Datei namens test.txt angelegt mit einigen Leerzeilen darin.
Leider komme ich immer nur in den else-Zweig und nie in den if-Zweig.
Obwohl leere Zeilen in der Datei sind werden sie mit der Anweisen "if(!$line)" nicht gefunden.
Hier mein Code:


Code:
#!/usr/bin/perl
use strict;
use warnings;

my $file = '/cygdrive/d/Perl/test.txt';
my $counter = 0;
my $line;

# open file for reading
open(FILE_HANDLE, "<", $file) || die "Error: $!";

# read the file line per line
while ($line = <FILE_HANDLE>)
{
  # print the line numbers in the form 000, 001, 002, ... 009, 010, ...
  # if a line is empty then it shall not be counted but also printed

  # remove \n from $line
  chop $line;

  if (!$line)
    {
      # empty line
      print "\n";
    }
  else
    {
      print sprintf("%3.3d", $counter++) . ": " . $line . "\n";
    }
}

close(FILE_HANDLE);



Was mache ich falsch? Ich verstehe es einfach nicht.

Danke schonmal im Voraus
Alfredo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.02.2007, 14:44 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Zunächst einmal solltest du chomp verwenden und nicht chop. Chop schneidet das letzte Zeichen ab, nicht nur \n und \r - chomp eben nur das newline.

Arbeitest du mit Windows? Da ist \n kein Newline sondern \r\n ...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.02.2007, 14:50 Uhr
~Alfredo
Gast


Danke für deine Antwort. Ich arbeite tatsächlich unter Windows. Habe mir die Textdatei in einem Hex-Editor angesehen. Das Newline wird mit 0x13 0x10 interpretiert.

Jetzt habe ich in diesem Programm 'chomp' anstatt von 'chop' verwendet. Allerdings findet er noch immer keine Leerzeilen. Was mache ich bloß falsch?

Schneidet chomp immer das komplette newline ab, d.h. unter Windows 0x13 0x10 und unter Unix 0x10?

Gruß
Alfredo
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Perl/CGI ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: