Schrift
[thread]8762[/thread]

nested local() scoping: @ARGV und $/



<< >> 7 Einträge, 1 Seite
dukeofnukem
 2007-02-15 20:49
#74365 #74365
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
Alohá!

Folgendes Phänomen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sub get_errors {
my $file = $_[0];
my $cont = do { local( @ARGV, $/ ) = $file; <> };
<regexp auf $cont mit $_[1] hier>
$1;
}

sub main {
local @ARGV = @_;
@ARGV = glob '<Dateiglob hier>' unless @ARGV;
local $/ = "\n\n\n";
[...]
while (<>) {
if (<regexp hier>) {
$stat{$rtsdir}{'errors'}++;
if ($opts{'errors'}) {

my $error = get_errors($anotherfile, $case);
[...]
}
next;
}
[...]
}
}


Ist die Option nicht gesetzt, habe ich ca. 4000 Iterationen, mit gesetzter Option kommen nur 1700 zurück...

Der Trenner \n\n\n ist normalerweise der Beginn eines neuen Abschnitts in der Datei die ich analysieren möchte (die in @ARGV enthalten ist). Wenn ich beim Durchlaufen einer dieser Dateien auf einen Fehler laufe ist der Grund für diesen Fehler in einer anderen Datei ($anotherfile) zu finden die ich dann mittels get_errors nach dem Grund durchforste.

Habe mir schon @ARGV und S/ vor und nach dem Aufruf von get_errors printen lassen und keinen Unterschied feststellen können ~:-/

Was mache ich falsch?\n\n

<!--EDIT|dukeofnukem|1171565672-->
drum&bass is a state of mind
pq
 2007-02-15 22:21
#74366 #74366
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
mach mal noch
local *ARGV;
in der get_errors()
das ist der momentan benutzte filehandle (bzw. setzt du damit alle
variablen namens ARGV local, auch $ARGV)\n\n

<!--EDIT|pq|1171571044-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
dukeofnukem
 2007-02-16 11:47
#74367 #74367
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
THX! Das hats erschlagen.

Code: (dl )
    my $cont = do { local( *ARGV, $/ ); @ARGV = $file; <> };


Also war $ARGV noch von außen gesetzt, entsprechend hat <> falsch angesetzt? :rock:
drum&bass is a state of mind
pq
 2007-02-16 11:53
#74368 #74368
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=dukeofnukem,16.02.2007, 10:47]Also war $ARGV noch von außen gesetzt, entsprechend hat <> falsch angesetzt? :rock:[/quote]
$ARGV (dateiname) und ARGV (filehandle), ja.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2007-02-16 16:06
#74369 #74369
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Und genau wie bei Kurze Frage zu Hash in Hash trifft auch fuer Dich zu: Mach vor dem while (<>) bitte noch ein local $_;
betterworld
 2007-02-16 17:47
#74370 #74370
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=pq,15.02.2007, 21:21]mach mal noch
local *ARGV;
in der get_errors()
das ist der momentan benutzte filehandle (bzw. setzt du damit alle
variablen namens ARGV local, auch $ARGV)[/quote]
Das lokalisiert dann auch @ARGV, oder? Vielleicht kann man auch local *ARGV{IO} machen (ungetestet).
pq
 2007-02-16 18:12
#74371 #74371
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=betterworld,16.02.2007, 16:47]Das lokalisiert dann auch @ARGV, oder?[/quote]
soll es ja in dem fall auch, denke ich.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 7 Einträge, 1 Seite



View all threads created 2007-02-15 20:49.