Schrift
[thread]7112[/thread]

Datei auslesen.. fehler im Script..: Hab wahrscheinlich n Logikfehler drin...



<< >> 8 Einträge, 1 Seite
Gast Gast
 2005-07-06 12:54
#56043 #56043
Hallo,

ich habe in meinem Script leider wohl irgend einen logik Fehler eingebaut. Folgendes TXT File versuche ich auszulesen:

Code: (dl )
1
2
3
4
5
6
REPORTLOG +"report.log"
TIMEOUTALL 7200
GROUP berlin otto walter hans
EXCLUDE PROE GROUP maulburg
GROUP stuttgart administrator ja sae wd
GROUP karlsruhe ic ae tt op


Ich benötige daraus die Namen nach den Gruppennamen ,zugeordnet zur Gruppe.

Das ist mein Script:

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
$file = 'ptc.opt';    
open(INFO, $file);
@lines = <INFO>;

my $groupname;

for (my $i=0;$i<@lines;$i++){
my @reihe = split(/ /, $lines[$i]);
my @groupmember;
if($reihe[0] eq "GROUP"){
$groupname = $reihe[1];
for (my $x=0;$x<@reihe;$x++){
if($x>1){
push(@groupmember,$reihe[$x]);
}
}
}
$groups{$groupname} = [@groupmember];

}

foreach $gruppe (keys(%groups)) {
print "\n".$gruppe.":\n ";
for(my $g=0;$g<@{$groups{$gruppe}};$g++){
print @{$groups{$gruppe}}[$g]." ";
}
}
close(INFO);


So nun bekomme leider keine Namen zu der Gruppe unter der "EXCLUDE PROE GROUP maulburg" steht.
Dabei sage ich doch explizit "Nur wenn $reihe[0] gleich "GROUP" ist dann fülle $groupmembers...

Ausgabe währe in diesem fall übrigens folgendes:

Quote
Use of uninitialized value in hash element at test.pl line 24, <INFO> line 6.
Use of uninitialized value in hash element at test.pl line 24, <INFO> line 6.

:

stuttgart:
administrator ja sae wd

karlsruhe:
ic ae tt op
berlin:


Weiß jemand rat?
Taulmarill
 2005-07-06 13:26
#56044 #56044
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Quote
Dabei sage ich doch explizit "Nur wenn $reihe[0] gleich "GROUP" ist dann fülle $groupmembers...

ja, das sagst du, aber die zuweisung in das hash ist nicht mehr im if-block, wir also immer ausgeführt. und da $groupname auserhalb der for schleife deklariert wurde, ist es auch noch mit dem alten gruppennamen gefüllt, @groupmember ist aber leer, da die variable ja beim zweiten schleifendurchlauf wieder neu deklariert wurde.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2005-07-06 13:27
#56045 #56045
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst die Zuweisung $groups{$groupname} = [@groupmember]; auch innerhalb des if-Blocks machen, sonst machst Du das bei jeder Zeile.

Noch ein allgemeiner Tipp: verwende use strict;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Taulmarill
 2005-07-06 13:33
#56046 #56046
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
hat jetzt nichts mit dem eigendlichen fehler zu tun, aber ich bevorzuge es, dateien nicht einfach komplett in einen array einzulesen (man weiss ja nicht, wie gross die datei ist). hier mal ein etwas anderer ansatz:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
open(INFO, "<ptc.opt") or die "$!";

while ( my $line = <INFO> ) {
next unless $line =~ /^GROUP/;
chomp $line;
$line =~ /GROUP ([^ ]*) (.*)/;
push @{ $groups{$1} }, split( " ", $2 );
}

close INFO;

for my $key ( sort keys %groups ) {
print "$key:\n";
print join( " ", @{ $groups{$key} } ), "\n";
print "\n";
}
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2005-07-06 13:37
#56047 #56047
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Taulmarill, warum arbeitest Du nicht gleich mit split??
Code: (dl )
1
2
3
4
5
6
while ( my $line = <INFO> ) {
next unless $line =~ /^GROUP/;
chomp $line;
my (undef,$groupname,@groupmembers) = split(/\s+/,$line);
push(@{$groups{$groupname} }, @groupmembers);
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Taulmarill
 2005-07-06 13:38
#56048 #56048
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
jau, da hast du eigendlich recht...
ich seh halt auch nicht immer alles :)
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Taulmarill
 2005-07-06 13:45
#56049 #56049
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
TIMTOWTDI:
Code: (dl )
my %groups = map { my(undef, $g, @g) = split; $g, [@g] } grep /^GROUP/, <INFO>;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
qualle-online
 2005-07-06 15:17
#56050 #56050
User since
2005-07-06
1 Artikel
BenutzerIn
[Homepage] [default_avatar]
Taulmarill dein Tip war schon ausreichend :-)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
for (my $i=0;$i<@lines;$i++){
    my @reihe = split(/ /, $lines[$i]);    
    my @groupmember;
 if($reihe[0] =~ m/GROUP/){
       $groupname = $reihe[1];
         for (my $x=0;$x<@reihe;$x++){
              if($x>1){
               push(@groupmember,$reihe[$x]);
               }
       }
 $groups{$groupname} = [@groupmember]; # Getauscht mit
 }                                          # Dieser Zeile
}


Das File besteht ja wie ihr seht nur aus 6-7 Zeilen. Die Lösung reicht also aus.\n\n

<!--EDIT|qualle-online|1120648718-->
<< >> 8 Einträge, 1 Seite



View all threads created 2005-07-06 12:54.