perl /regex/ feldolgozás

sziasztok!

van egy scriptem, ami paramétereket dolgoz fel és ennek van egy "nem várt" eredménye. a feldolgozás case szerkezeten keresztül megy. egyes esetekben két vagy-gyal kapcsolt eseményt vizsgálok és itt van egy hibám. azt akarom figyelni, hogy a paraméter "-d=" vagy "/d=" taggal kezdődik-e, vagy nem. ezt úgy csináltam, hogy

switch ($param) {
case /^[\-\/]d\=/i {parancs;}
}

ez elvben azt vizsgálná, hogy a paraméter "-d="-gel kezdődik-e, vagy hogy "/d="-gel. van négy ilyen kapcsolóm, ahol a "d" betű van lecserélve más-más betűre természetesen. ha nem vizsgálom azt, hogy ott-e az egyenlőség jel is, akkor működik (csak épp nem azt kapom, amit akarok...), ha 3 case-ben ott az egyenlőség jel, akkor még jó. ha viszont berakom a 4.-be is az egyenlőséget (először csak simán = volt ott, aztán gondoltam az a probléma, hogy az is valami regex, amit \= írással ki tudok kerülni), akkor viszont a program futása megakad "kilóméterekre onnan", syntaxis hibával (nyilván valamiképp felborítja a "páros jeleket".

a leginkább "vicces", hogy mivel ez egy subrutinban van feldolgozva, ezért szépen fogtam és, a javítás idejére, átmásoltam egy másik, üres scriptbe és ott próbáltam volna ki. ott viszont _hiba nélkül futott_. minden "páros jelet" átnéztem a kódban, nincs "páratlanul egyik se" (időzőjelek, kapcsols zárójelek, stb). bár már az is fura, hogy a sub áttéve egy "üres kódba" jól megy, az eredeti helyén meg nem. mintha "addigra elvesztené a fonalat a perl", vagy tudja fene...

találkozott már valaki ilyennel? ki lehet ezt valahogy javítani, vagy kerülni? amint lehagyom az = ellenőrzést is belőle, azonnal jó a "match", viszont nekem az is kell. mi a megoldás ilyenre?

Hozzászólások

egy kis kiegészítés, hogy érthetőbb legyen. alább a teljes switch:

switch ($param) {
case /^(-d=|\/d=)/i {
print "d\n";
}
case /^(-s=|\/s=)/i {
print "s\n";
}
case /^(-a=|\/a=)/i {
print "a\n";
}
case /^(-f=|\/f=)/i {
print "f\n";
}
case /^(-j=|\/j=)/i {
print "j\n";
}
else {
# rossz paraméterek
}

amennyiben az esetek között levő s kapcsolót vizsgálom, akkor a következő hibát kapom:
syntax error at service.pl line 42, near "}continue"
syntax error at service.pl line 61, near "}"
syntax error at service.pl line 83, near "}"
syntax error at service.pl line 93, near "}"
Execution of service.pl aborted due to compilation errors.

a megjelölt sorok az "s" vizsgálat után jövő összes lezáró } jelnél vannak (case lezáró).

ha ott az s betű vizsgálatot átírom q betűre (tényleg kipróbáltam erre is :D), akkor már jó is lesz! ha kihagyom, akkor is jó. de amikor ott van, akkor nem jó... valami spec jelentése lenne egy bizonyos betűnek??

--
xterm

1. use strict; use warnings;

2. A Switch modul Perl 5-ben elavult és nem működik rendesen. Ez nem C.

3. Program bemenő paraméterezésére ne használj saját magad által írt szerkezetet. Itt a Getopt::Long a célra.

4. Ha mégis saját magad akarsz bűvészkedni (ami igazán nem ajánlott), akkor használj Perl 5.10-et és given/when szerkezetet:

given($_) {
when (/^abc/) { $abc = 1; }
when (/^def/) { $def = 1; }
when (/^xyz/) { $xyz = 1; }
default { $nothing = 1; }
}

köszönöm szépen a tanácsot, dolgozom az ügyön. a switchről találtam olyat, hogy le van cserélve, de mivel működött, ezért nem hittem, hogy hibásan műdödik. a paramétereket azért kezdtem én feldolgozni, mert nem tudtam a getopt::long modul létezéséről, kösz érte. franc küzdjön, ha már más megtette, jogos. (kisegítenél egy picit: hogy tudom kikapcsolni, hogy "panaszkodjon" előre meg nem mondott kapcsolókra?)

--
xterm


use Switch;

my $param = $ARGV[0];

switch ($param) {
    case /^(-d=|\/d=)/i {
        print "d\n";
    }
    case /^(-s=|\/s=)/i {
        print "s\n";
    }
    case /^(-a=|\/a=)/i {
        print "a\n";
    }
    case /^(-f=|\/f=)/i {
        print "f\n";
    }
    case /^(-j=|\/j=)/i {
        print "j\n";
    }
    else {
        #rossz parameterek
    }
}

Nalam ez tokeletesen mukodik
perl -v: "This is perl, v5.8.8 built for i686-linux"

szerintem nincs miért feltölteni, a keresgélésem eredménye alátámasztja azt, hogy a switch nem működik mindig jól regexp-ek esetén. továbbá ahogy a kedves kollega mondta, teljesen értelmetlen maga a feladat, hogyha ott a GetOptions(), ami több mint elég nekem arra, amiért ezt a béna switch/case halmazt gyártottam. (nem lusta vagyok, hanem így már nincs szükség talán rá, másfelől meg van benne sok olyan kód, ami "nem nyilvános", ha meg "elmaszkolom, akkor honnan tudhatnánk, hogy nem pont a maszk nélkül bukik fel a feldolgozás)

--
xterm

A switch mindíg jól, működik. Viszont syntaktikailag hibás a regexp.
Valamint mindenképpen a Getopt::Long a használandó, mert kényelmesebb és bitonságosabb
----
概略情報