perl ciklus kétszer (???!) fut le...

Sziasztok.

Egy apró kis problémám lenne. Egy perl scriptet kell irnom, de nagyon belebonyolodtam. Az egyik for ciklusom látszolag kétszer fut le:

open ACTFILE, "<", "/u/SDH/SMT/Data/Stammdaten/Leiterplatten/$actprog".".la".'/'.".qd" or die "No such file";
@progfile = ACTFILE; # '<' és '>' csak a postban van kihagyva.
for $lines (@progfile) {
if ($lines =~ m/BE\s\'/) {
push @compclear, $lines;
}
}
for $compnr (@compclear) {
$compnrdrb = substr ($compnr,7,10);
push @csakcomp, $compnrdrb;
}
for $alkatresz (@csakcomp) {
open ALKFILE, "/u/SDH/SMT/Data/Stammdaten/BE-Bibliothek/$alkatresz".".be";
@alkhalom = ALKFILE; # '<' és '>' csak a postban van kihagyva.
for $checkcomp (@alkhalom) {
if ($checkcomp =~ m/TRACEABILITY/) {
push @tracecomp, "$alkatresz";

print "@tracecomp\n";
}
}
}

Valaholl valami nem jó, de nem találom az elirást.
Valakinek valami feltünö ? Esetleg ötelet hogy hogyan lehetne másként ?

Köszi elöre is !

Hozzászólások

Szia!

Szerintem könnyebb lenne, ha nagyjából leírnád, hogy mit akar csinálni ez a script.

Így ránézésre a következők jutottak eszembe:

Ha jól látom, három fő részből áll.

Az első részben az adott bemeneti fájlból kiszedi azokat a sorokat, amik a /BE\s\'/ regexpre illeszkednek.

Ezt én így csinálnám, ha nem használhatom a linuxos grep parancsot:

open(IF,"befile")
@progfile = <IF>;
@compclear=grep(/BE\s\'/,@progfile);

A második részben a @compclear minden sorából kiveszed a sor 8-17. karakterét

map{$_=substr($_,7,10)}@compclear;

A harmadik részben meg az így visszakapott stringek által meghatározott fileokból kiszeded a TRACEABILITY stringet tartalmazó sorokat, és a végén ki akarod az ilyen sorokat printelni. (Szerintem itt a te verziódban a print parancs egy zárójellel beljebb van, mint ahol logikus, de persze te tudod, mit akarsz csinálni.)

foreach $file (@compclear){
    $file='/u/SDH/SMT/Data/Stammdaten/BE-Bibliothek/'.$file.'.be';
    open(TF,$file)or die "Cannot open file:$!\n";
    @lines=<TF>;
    @results=grep(/TRACEABILITY/,@lines);
    print "@results\n";
}

Csaba

Köszi a hozzászollást !
A végén a print parancs azért van ott aholl van, mert nem a sorokat akarom kiiratni amiben a TRACEABILITY string van, hanem a filok neveit amelyek tartalmazzák a ezt a stringet.
A dolog kicsit bonyolult: elektronikai áramköröket gyártunk, és bizonyos használt alkatrészek
adatait (sorozatszám, gyártó, beszállítási idö stb...) el kell tárolni egy oracle adatbázisba. Ez a része meg is van, csak kicsit bugos, nem mindig tárolodik el teljes egésszében az adat, és nekem most
ezt kellene visszaellenörizni hogy helyesen lett-e eltárolva.
Alapbol egyszerü lenne (SQL lekérdezés, és =~ m/mintaregexp/, de ezek az adatok két különbözö idöpontban keletkeznek, és az elsö keletkezési idöpontjában a második inkomplet. Ezért kell mindenhonnan összeszedjek adatokat: az egyik file tartalmaz egy stringet ami az aktuálisan vizsgált termék vonalkodja, a másik file tartalmazza hogy ehez a típusu termékhez milyen nevü beültetési prograot használok, a beültetési programban (ezt tartalmazza a code rész amit bevágtam) van benne mely alaktarészek vannak beültetve az aktuális tipusba és bizonyos alkatrészfilok pedig tartalmazzák a TRACEABILITY stringet, na öket kell követni :).

--
Nem tudom miert jottem, de azt igen hogy miert megyek el.

Igen, csak nem figyeltem.

Ez esetben szerintem a harmadik rész így módosítva jó:

@results=();

foreach my $file (@compclear){

    $file='/u/SDH/SMT/Data/Stammdaten/BE-Bibliothek/'.$file.'.be';
    open(TF,$file)or die "Cannot open file:$!\n";
    @lines=<TF>;
    if(grep(/TRACEABILITY/,@lines)){
	push @results,"$file\n";
    }

    print @results;
}

Jó így?

Csaba