Thread @ARGV und while(<>) (7 answers)
Opened by toby at 2006-05-20 12:27

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.)

View full thread @ARGV und while(<>)