Portál AbcLinuxu, 13. května 2025 21:50

Dotaz: Perl a rozdělení textu

23.5.2010 19:37 LuRy | skóre: 12
Perl a rozdělení textu
Přečteno: 327×
Odpovědět | Admin
Ahoj, Pár dní řeším problém jak rozdělit text podle regulerniho vyrazu v momente kdyz se v souboru daný text obevuje víckrát vyhovujivcí stejnému reg. výrazu. "=~" mi vypíše pokaždé jenom první výskyt. Zkouším to mimo na příkladu dole, kde potrebuju z retezce vypsat pouze to co je mezi dvojteckama a podari se mi vypsat jenom 3434 (udělat reg. vyraz pro cely tento retezc mi moc nepomuze vzhledem k tomu ze nemuzu predpovidat kolik tech cisel mezi dvojteckami bude, tohle je jen pouze testovaci priklad) zkousel sem i ty rozdelovaci podminky pod sebe nebo i grepem kterym se mi to moc nepovedlo, nejlepsi vystup by byl do pole nevíte někdo jak na to?

$cislosmajlu = "---:3434: dasdas :2343:dasd a :5678:adasd dsadas:43587:aaaaaaa:23456879:"; if ($cislosmajlu =~ /(:([0-9]+):)+/) { print $1 ;}

Řešení dotazu:


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

Odpovědi

23.5.2010 20:06 Ondřej Kopka | skóre: 20 | blog: ondrejk
Rozbalit Rozbalit vše Re: Perl a rozdělení textu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ahoj, zkus split
23.5.2010 20:14 LuRy | skóre: 12
Rozbalit Rozbalit vše Re: Perl a rozdělení textu
taky me napad split jenze podle ceho to rozdelit splitem to uz sem nevykoumal.. mozna podle tech dvojtecek jenze to bude desnej chaos z toho vybrat to co fakt potrebujes
23.5.2010 20:29 buff | skóre: 10 | blog: buff
Rozbalit Rozbalit vše Re: Perl a rozdělení textu
A co vlastně potřebuješ? :-) Jen to, co je mezi dvojtečkami a zároveň číslo? Nebo...?
23.5.2010 21:14 buff | skóre: 10 | blog: buff
Rozbalit Rozbalit vše Re: Perl a rozdělení textu

Kdyžtak toto:

$cislosmajlu = "---:3434: dasdas :2343:dasd a :5678:adasd dsadas:43587:aaaaaaa:23456879:";
map {print "$_\n"} grep {m/[0-9]+/} split(':', $cislosmajlu);
wamba avatar 23.5.2010 20:29 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Perl a rozdělení textu
Odpovědět | | Sbalit | Link | Blokovat | Admin
no teoreticky by šlo

$cislosmajlu = "---:3434: dasdas :2343:dasd a :5678:adasd dsadas:43587:aaaaaaa:23456879:";

while ( $cislosmajlu =~ /(:([0-9]+):)+/g ) { print $1 ;}

This would have been so hard to fix when you don't know that there is in fact an easy fix.
wamba avatar 23.5.2010 20:50 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Perl a rozdělení textu
popřípadě

my $cislo_smajlu
    = "---:3434: dasdas :2343:dasd a :5678:adasd dsadas:43587:aaaaaaa:23456879:";

foreach my $cislo (
    $cislo_smajlu =~ m/(?: :( [0-9]+ ): )+/xg
    ) {
        print "$cislo ";
}
This would have been so hard to fix when you don't know that there is in fact an easy fix.
23.5.2010 21:09 LuRy | skóre: 12
Rozbalit Rozbalit vše Re: Perl a rozdělení textu
jo diky moc , jeslit bych te mohl pozadat vysvetlil bys mi ty znaky za a pres / ? m/ /xg hledal sem to ale poradny vysvetleni nebo prehled vsech sem nenasel pouzivam /i nebo bez pismen jinak ti davam bod diky moc
wamba avatar 23.5.2010 21:21 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Perl a rozdělení textu
teď jsem si všiml že tam mám závorku zbytečnou (nechal jsem se unést vaším řešením) stačí:

m/:( [0-9]+ ):/xg

m je tam více méně zbytečný, muselo by tam být v případě např:

m{ :( [0-9]+ ): }xg

x umožňuje (pro přehlednost) vkládat do regulárního výrazu mezery a g je "global" tedy najdi všechny výrazy nejen první
This would have been so hard to fix when you don't know that there is in fact an easy fix.
Řešení 2× (misch, buff)
23.5.2010 22:06 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Perl a rozdělení textu
Jo, ale nepoužil bych to ve while, ale prostě
@smajly = (text =~ /:([0-9]+):/g);
In Ada the typical infinite loop would normally be terminated by detonation.

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.