Schrift
[thread]7999[/thread]

@ARGV und while(<>)

Leser: 1


<< >> 8 Einträge, 1 Seite
toby
 2006-05-20 12:27
#66335 #66335
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo Community :)

folgendes Problem:

Code: (dl )
1
2
3
4
5
@ARGV = qw/a b c/;
print "uebergeben: @ARGV\n";
while(<>){
}
print "geblieben: @ARGV\n";


ich habe vorhin viel Zeit bei einer Übung verloren, bis ich festgestellt habe, dass while(<>) beim Durchlaufen von @ARGV diese Liste einfach leert.

Warum ist es so und wie kann ich die Argumente "retten"?

Danke!
Tobias
steffenw
 2006-05-20 13:19
#66336 #66336
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Jedes Perl Script beginnt mit:
use strict;
use warnings;

@ARGV beschreibt man doch nicht selbst, sondern das ist das, was beim Programmaufruf mit übergeben wird, die Kommandozeile also. Da steht das drin, was nach perl scriptname ... steht.

Das <> in Deinem while ist doch die Kurzform von <STDIN>. Also was hat das eine mit dem anderen zu tun?

Ich empfehle Dir, ein Perl-Einsteigerbuch zu kaufen, dort ist das ales sehr gut erklärt: z.B. Einführung in Perl. Das gibt's bei Amazon zur Zeit schon für 6,99 ¤.
$SIG{USER} = sub {love 'Perl' or die};
toby
 2006-05-20 14:35
#66337 #66337
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hi,

> Jedes Perl Script beginnt mit:
> use strict;
> use warning;

ich habe ja nur ein Ausschnitt gepastet und das restliche und überflüssige "Balast" entfernt...

> @ARGV beschreibt man doch nicht selbst

siehe oben.. dieser Ausschnitt sollte nur als Beispiel dienen, um es zu verdeutlichen... ansonsten warum soll es falsch sein @ARGV auf diese Weise zu initialisieren???

> Das <> in Deinem while ist doch die Kurzform von <STDIN>. Also was hat das eine mit dem anderen zu tun?

Es war ja ein Beispielcode um mein Problem vorzustellen...

> Ich empfehle Dir, ein Perl-Einsteigerbuch zu kaufen..

Heute schlecht geschlaffen, oder? Sogesehen bräuchte man solche Foren wie dieses nicht, weil ja alles in den man-pages, usw steht.. Im extremfall könnte man ja im Sourcecode von Perl nachschauen, warum etwas so und nicht so läuft... Übrigens habe ich das Lama-Buch vor mir liegen, nur nicht immer steht alles drin und nicht immer versteht man alles sofort, deswegen ist es doch legitim nachzufragen, oder?

...nichts für ungut, vieleicht kann mir jemand anderer helfen und aufklären warum beim iterieren die Argumente aus der Liste verschwinden?

Gruß
Tobias\n\n

<!--EDIT|toby|1148121610-->
GwenDragon
 2006-05-20 15:29
#66338 #66338
User since
2005-01-17
14757 Artikel
Admin1
[Homepage]
user image
[quote=toby,20.05.2006, 10:27]Hallo Community :)

folgendes Problem:

Code: (dl )
1
2
3
4
5
@ARGV = qw/a b c/;
print "uebergeben: @ARGV\n";
while(<>){
}
print "geblieben: @ARGV\n";


ich habe vorhin viel Zeit bei einer Übung verloren, bis ich festgestellt habe, dass while(<>) beim Durchlaufen von @ARGV diese Liste einfach leert.

Warum ist es so und wie kann ich die Argumente "retten"?

Danke!
Tobias[/quote]
Code: (dl )
1
2
3
4
5
6
7
@ARGV = qw/a b c/;
print "uebergeben: @ARGV\n";
foreach my $a (@ARGV){
# in $a ist jetzt jeder Wert von @ARGV
print "Argument ist $a\n";
}
print "geblieben: @ARGV\n";

So bleibt @ARGV erhalten!\n\n

<!--EDIT|GwenDragon|1148124775-->
Strat
 2006-05-20 16:06
#66339 #66339
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
zumindest, solange man $a (was man eigentlich besser nur fuer die sort-funktion verwenden sollte) nicht veraendert...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Dubu
 2006-05-20 17:26
#66340 #66340
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@toby: Wie wäre es einfach mit einem
Code: (dl )
my @Arguments = @ARGV;
vor der Schleife?

@steffenw: Nein, <> ist eben nicht das Gleiche wie <STDIN>. Nur, wenn das Skript keine Argumente übergeben bekommt, ist es gleich. Siehe auch perlop:
[quote=perlop,I/O Operators]

Code: (dl )
1
2
3
           while (<>) {
              ...                     # code for each line
          }

      is equivalent to the following Perl-like pseudo code:

Code: (dl )
1
2
3
4
5
6
7
           unshift(@ARGV, '-') unless @ARGV;
          while ($ARGV = shift) {
              open(ARGV, $ARGV);
              while (<ARGV>) {
                  ...         # code for each line
              }
          }

[/quote]
Wenn man aus <> liest, werden also alle Argumente als Dateinamen interpretiert, aus denen nacheinander gelesen wird.

Der leere Diamantoperator ist sehr praktisch, um Programme zu schreiben, die wie übliche Filter unter UNIX/Linux funktionieren. Die folgenden Zeilen machen dann (fast) dasselbe:
Code: (dl )
1
2
3
$ programm datei1 datei2 datei3

$ cat datei1 datei2 datei3 | programm

(Der Unterschied liegt darin, dass ich im ersten Fall in programm an die einzelnen Dateinamen kommen kann, im zweiten Fall nicht.)
coax
 2006-05-20 17:30
#66341 #66341
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Ich denke toby ruft sein Perlscript mit Dateinamen als Argumenten auf, die Dateien will er dann in der while-Schleife durchwandern, moechte aber den Inhalt von @ARGV behalten.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

 use strict;
 use warnings;

{
 local @ARGV = @ARGV;        # lokale Kopie von @ARGV anlegen

 while(<>) {
     print if not m(^#);     # gibt's aus wenn's kein Kommentar ist
 }
}
 printf("Groesze von \@ARGV: %d\n", scalar(@ARGV));


Grusz Christian.
,,Das perlt aber heute wieder...'' -- Dittsche
steffenw
 2006-05-20 21:15
#66342 #66342
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Dubu,20.05.2006, 15:26]@steffenw: Nein, <> ist eben nicht das Gleiche wie <STDIN>. Nur, wenn das Skript keine Argumente übergeben bekommt, ist es gleich. Siehe auch perlop[/quote]
oh Schei...
$SIG{USER} = sub {love 'Perl' or die};
<< >> 8 Einträge, 1 Seite



View all threads created 2006-05-20 12:27.