Portál AbcLinuxu, 9. května 2025 23:34

Dotaz: Perl - proč nefunguje -g modifikátor v regexu?

22.2.2011 15:44 Pirkil
Perl - proč nefunguje -g modifikátor v regexu?
Přečteno: 130×
Odpovědět | Admin
Dobrý den, mám následující regex:

use strict; use warnings; use carp;

if ($line =~ m{\b(\w+)\b \s* \b(\w+)\b #slovo v okolí hledaného slova \s* #mezera \b$slovo\b #hledané slovo \s* \b(\w+)\b \s* \b(\w+)\b}ixg)

I s modifikátorem 'g' mi při prohledávání textu najde pouze první výskyt tohoto vzoru na řádce. (Mám zjištěno, že vzoru odpovídají i jiné části řádky.) V kódování problém není, protože najde i výrazy s diakritikou.

Díky za pomoc.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

22.2.2011 16:03 Jirka P
Rozbalit Rozbalit vše Re: Perl - proč nefunguje -g modifikátor v regexu?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Napiš celý funkční (může být zjednodušený) kód + příklad dat, který demonstruje problém. Speciálně by tam měly být smyčky (jestli to je ve smyčce) a všechny operace s $line.

Takhle se k tomu dá říct jen to, že jedním matchováním (byť s /g) dostaneš ve skalárním kontextu vždy jen jeden výsledek. Taky je možný, že si tím matchováním sežereš i ostatní výskyty.
22.2.2011 16:34 Pirkil
Rozbalit Rozbalit vše Re: Perl - proč nefunguje -g modifikátor v regexu?
Díky - už jsem na to přišel (bylo mi porazeno). Nemá to být podmínka if, ale cyklus while. To jsem před tím nevěděl.
22.2.2011 20:28 Jirka P
Rozbalit Rozbalit vše Re: Perl - proč nefunguje -g modifikátor v regexu?
ve skutečnosti je jedno, jestli je to if nebo while - ale muí to být ve smyčce. Např. tohle taky funguje (čte $line dál a dál):
while(true) {
  $line ~= /re/g;
 ...
  $line ~= /er/g;
}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.