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 !
- 1092 megtekintés
Hozzászólások
futtasd debuggal: perl -d script
zsolt
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Köszi szépen ! Ez lessz az. A probléma ezek szerint a plussz egy ciklus miatt volt az if () elött.
--
Nem tudom miert jottem, de azt igen hogy miert megyek el.
- A hozzászóláshoz be kell jelentkezni