Pokúšam sa analyzovať reťazec v jazyku Perl vo formáte:
Messages pushed to the Order Book queues 123691 121574 146343 103046 161253
Chcem získať prístup k číslam na konci reťazca, takže mienim urobiť zápas
/(d+)/s
Môj problém je, že počet hodnôt na konci obsahuje premenlivý počet reťazcov.
Aký je najlepší spôsob formátovania regexpumáte prístup ku každému z týchto čísel jednotlivo? Som vývojár C ++ a učím sa Perl, takže sa snažím nájsť najčistejší Perl spôsob, ako to dosiahnuť.
Vďaka za vašu pomoc.
odpovede:
6 pre odpoveď č. 1Stačí použiť príznak / g, aby operátor zápasu urobil globálnu zhodu. V kontexte zoznamu operátor zhody vráti všetky výsledky ako zoznam:
@result = $string =~ /(d+)/g;
Funguje to, ak neexistujú žiadne iné čísla ako koncové čísla.
4 pre odpoveď č. 2
Operátor zhody môžete použiť v kontexte zoznamu s globálnou vlajkou na získanie zoznamu všetkých vašich zátvoriek. Príklad:
@list = ($string =~ /(d+)/g);
Váš zoznam by teraz mal obsahovať všetky skupiny číslic vo vašom reťazci. Pozrite si dokumentáciu k internetu operátor zápasu pre viac informácií.
1 pre odpoveď č. 3
„V skalárnom kontexte každé spustenie m // g nájde nasledujúcu zhodu, vráti true, ak sa zhoduje, a false, ak už neexistuje žiadna zhoda“ - (Z perldoc perlop
)
Mali by ste teda byť schopní vytvoriť globálnu slučku regulárneho obvodu, napríklad:
while ($string =~ /(d+)/g) {
push @queuelist, $1;
}
0 pre odpoveď č. 4
Ja by som urobil niečo takéto:
my @numbers;
if (m/Messages pushed to the Order Book queues ([ds]+)/) {
@numbers = split(/s+/, $1);
}
Nie je potrebné ho napchávať do jedného regexu.