Schrift
[thread]7952[/thread]

Probleme mit eigenem Package: Daten gehen verloren...



<< >> 7 Einträge, 1 Seite
Gast Gast
 2006-05-08 21:51
#65750 #65750
Hallo Perl-Gurus,

ich habe ein Problem. Ich muss Textdateien, die während eines Buildprozesses von einem Code-Analyse-Tool erzeugt werden, parsen und auswerten. Im Scriptverzeichns liegt eine Datei 'dirs' mit den Pfaden zu den verschiedenen Builds. Für jeden dieser Pfade wird ein Objekt erzeugt, das sich um das Parsen kümmert.

Der folgende Code ist abgespeckt, aber im Prinzip lauffähig.

Warum werden im folgenden Code beim 1. Dump die korrekten Dateinamen der Textdateien und im 2. Dump, nachdem das Parsen schon erledigt ist, nur noch 'undef' ausgegeben?

Danke schonmal...


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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main;
use strict;

use Data::Dumper;

open F, "<dirs" || die qq($!);
my @builds = <F>;
close F;

foreach my $dir (@builds)
{
  chomp $dir;
  my $build = MyPackage->new($dir);
 
  print Dumper($build);
  $build->scan_resultfiles();
  print Dumper($build);
}

package MyPackage;
use strict;
use File::Basename;
use File::Spec;
use Cwd;

sub new
{
my $proto  = shift;
my $class  = ref ($proto) || $proto;
my $ptr    = {};
bless ($ptr, $class);
$ptr->init(@_);
return $ptr;
}

sub init($$)
{
  my ($this, $path) = @_;
 
  $this->{root} = $path;

  opendir DIR, File::Spec->catdir($path, qw(lint\msg));
  @{$this->{errorfiles}->{lint}} = grep /\.txt$/, readdir DIR;
  closedir DIR;
}

sub scan_resultfiles($)
{
  my $this = shift;

  foreach (@{$this->{errorfiles}->{lint}})
  {
     $this->parse_file(File::Spec->catfile(File::Spec->catdir($this->{root}, qw(lint\msg)), $_));
  }
}

sub parse_file($$)
{
  my ($this, $errfile) = @_;
 
  open FILE, "<$errfile" || die qq($!);  
  while (<FILE>)
  {
     chomp;
     # ...
  }
  close FILE;  
}

1;


edit pq: code-tags hinzugefügt\n\n

<!--EDIT|pq|1147111721-->
bo
 2006-05-09 13:07
#65751 #65751
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
Ich habe die Lösung gefunden, verstehe allerdings nicht, warum durch die Verwendung von '$_' in der Schleife die Werte innerhalb des Arrays auf undef gesetzt werden...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
...

sub scan_resultfiles($)
{
my $this = shift;

foreach my $entry (@{$this->{errorfiles}->{lint}})
{
$this->parse_file(File::Spec->catfile(File::Spec->catdir($this->{root}, qw(lint\msg)), $entry));
}
}

...
GwenDragon
 2006-05-09 14:15
#65752 #65752
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
qw(lint\msg) sollte wohl qw(lint\\msg) sein, oder?
bo
 2006-05-09 15:51
#65753 #65753
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
nee, das funktioniert...
das ist ja das schöne an qw()
:)
esskar
 2006-05-09 19:42
#65754 #65754
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
man kann es nachbauen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use strict;
use warnings;

use Data::Dumper;

my @list = qw/uhu1 uhu2 uhu3/;
print Dumper(\@list);
foreach (@list) { foo($_); }
print Dumper(\@list);

sub foo {
while (<DATA>) {
print "$_";
}
}


__DATA__
hutzel
putzel
ultimo


dass $_ scheint irgendwie durchgereicht zu werden.
nachdem kein DATA mehr vorhanden ist, wird $_ in der Funktion foo undef
esskar
 2006-05-09 20:42
#65755 #65755
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
use Data::Dumper;

my @list = qw/uhu1 uhu2 uhu3/;
print Dumper(\@list);
foreach (@list) { foo($_); }
print Dumper(\@list);

sub foo { $_ = undef; }


umgehbar mit

Code: (dl )
1
2
3
4
5
6
7
8
use Data::Dumper;

my @list = qw/uhu1 uhu2 uhu3/;
print Dumper(\@list);
foreach (@list) { foo($_); }
print Dumper(\@list);

sub foo { local $_; $_ = undef; }
bo
 2006-05-10 09:58
#65756 #65756
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
danke für den tip :)
<< >> 7 Einträge, 1 Seite



View all threads created 2006-05-08 21:51.