Portál AbcLinuxu, 10. května 2025 06:40
/(.+) (\d) (\d+) ([+-]?[\d\.]+)/
Mel by se tim testovat kazdy radek souboru na svou formalni spravnost. Chapu to tedy tak, ze prvni sloupecek ma obsahovat jakykoliv retezec, druhy sloupecek jednu cislici, treti sloupecek libovolne cislo. Tohle vsechno jsem si nejak otestoval a melo by to tak byt. Nicmene ta posledni zavorka mi neni nejak jasna. Ja to chapu tak, ze by ctvrty sloupecek mel byt retezec, ktery muze nebo taky nemusi obsahovat + nebo - a dale taky obsahuje alespon jednu cislici nebo tecku. Ovsem to se neshoduje s tim, jak se to chova. Jak mam tedy tu ctvrtou zavorku chapat?
Jen pro prehlednost pridavam jeste vetsi cast kodu pro lepsi porozumeni
while (FILE) { if (not /^\#/) { chomp; /(.+) (\d) (\d+) ([+-]?[\d\.]+)/ or print "Error interpreting line:\n$_\n";}}Mam tedy napriklad jeden radek ktery ve ctvrtem sloupecku obsahuje cisla, ale i pismena a ten projde, nicmene nejaky dalsi radek, ktery obsahuje ve ctvrtem sloupci jinak usporadana pismena s cisly tak ten se uz vytiskne s polu s chybovou hlaskou. Jak je to mozne, podle me by prece mela chybova hlaska vyskocit pokazde, kdyz je obsazeno cokoliv jineho nez + - . nebo cislice
Řešení dotazu:
while (<FILE>) ...
u toho regulárního výrazu chybí ^ na začátku a $ na konci. Takže když matchuje substring, tak to projde.
To první matchuje cokoliv, aby to bralo jenom jeden sloupec, muselo by to být ([^ ]+)
To čtvrté matchuje něco, co volitelně začne +
nebo -
a dále pokračuje jako posloupnost čísel a teček (přičemž obsahuje nejméně jedno číslo či jednu tečku), tedy asi něco jako číslo (které by bylo lepší ([+-]?(\d+(\.\d*)?|\.\d+))
)
A matchuje to i substring, tedy stačí, aby jen část řádku toto splňovala
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.