Thread View: pl.comp.lang.perl
4 messages
4 total messages
Started by ag :)
Sun, 16 May 2010 08:23
[NewBie] Sprawdzenie zawartości listy?
Author: ag :)
Date: Sun, 16 May 2010 08:23
Date: Sun, 16 May 2010 08:23
11 lines
1579 bytes
1579 bytes
Witam Dopiero zaczynam zabawę z Perlem i mam następujący problem: mam zwykłą listę, która zawiera pojedyncze słowa. Odczytuję z pliku wiersz i chcę sprawdzić, czy zawiera on choć jeden ze słów z listy. Oczywiście mogę z każdym robić foreacha na listę i sprawdzać czy coś w tym wierszu jest z listy, ale mam wrażenie, że istnieje lepszy sposób. Z góry dzięki, ag
Re: [NewBie] Sprawdzenie zawartości listy?
Author: Stachu 'Dozzie' K.
Date: Sun, 16 May 2010 08:47
Date: Sun, 16 May 2010 08:47
42 lines
2626 bytes
2626 bytes
On 2010-05-16, ag :) <agnienowak@gmail.com> wrote:
> Witam
>
> Dopiero zaczynam zabawę z Perlem i mam następujący problem: mam zwykłą
> listę, która zawiera pojedyncze słowa. Odczytuję z pliku wiersz i chcę
> sprawdzić, czy zawiera on choć jeden ze słów z listy. Oczywiście mogę
> z każdym robić foreacha na listę i sprawdzać czy coś w tym wierszu
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> jest z listy, ale mam wrażenie, że istnieje lepszy sposób.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Oj żeby tak jak ty sądził autor logwatcha... <sigh>
Jeśli lista słów jest dość krótka, robisz tak (bez niepotrzebnych
perlowych idiomów, żeby nie zaciemniać kodu):
#v+
my @slowa = ("jedno", "drugie", "trzecie", "czwarte");
my @temp_slowa = map { "\\Q$_\\E" } @slowa;
my $slowa_match = join "|", @temp_slowa;
$slowa_match = qr/$slowa_match/;
#v-
Teraz dla każdej linii sprawdzasz dopasowanie:
#v+
while (<CZYTANYPLIK>) {
if (/$slowa_match/) {
print "dopasowanie!";
}
}
#v-
Do doczytania:
- perldoc -f map
- perldoc -f join
- perldoc perlre (znaczniki \Q...\E)
- perldoc perlop (operator qr//)
P.S. Zna ktoś lepszy sposób? Obawiam się że takie konstruowanie regexpa
może w pewnym momencie wyczerpać RAM.
--
Secunia non olet.
Stanislaw Klekot
Re: [NewBie] Sprawdzenie zawartości listy?
Author: Szymon Sokół
Date: Sun, 16 May 2010 09:17
Date: Sun, 16 May 2010 09:17
32 lines
2509 bytes
2509 bytes
On Sun, 16 May 2010 01:23:50 -0700 (PDT), ag :) wrote:
> Witam
>
> Dopiero zaczynam zabawę z Perlem i mam następujący problem: mam zwykłą
> listę, która zawiera pojedyncze słowa. Odczytuję z pliku wiersz i chcę
> sprawdzić, czy zawiera on choć jeden ze słów z listy. Oczywiście mogę
> z każdym robić foreacha na listę i sprawdzać czy coś w tym wierszu
> jest z listy, ale mam wrażenie, że istnieje lepszy sposób.
Tradycyjnie, kilka. Ale najwydajniej chyba będzie z tych słów zbudować
regexp pasujący do każdego z nich. Czyli:
my @lista = ("To", "jest", "lista", "słów");
my $regexp = join '|', @lista;
$regexp = qr/$regexp/o; # skompilowany regexp szybciej działa
a potem
if($wiersz =~ $regexp) ...
Jeśli zamiast zwykłych słów byłyby wyrażenia potencjalnie zawierające znaki
mające znaczenie specjalne dla regexpów (nawiasy, kropka, gwiazdka, pytajnik
itd.), to żeby nie zostały zinterpretowane jako specjalne, tylko literalnie,
należy je jeszcze obstawić \Q i \E:
my $regexp = join '|', map "\Q$_\E", @lista;
--
Szymon Sokół (SS316-RIPE) -- Network Manager B
Computer Center, AGH - University of Science and Technology, Cracow, Poland O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982 F
Free speech includes the right not to listen, if not interested -- Heinlein H
Re: [NewBie] Sprawdzenie zawartości listy?
Author: hubert depesz lubaczewski
Date: Sun, 16 May 2010 16:11
Date: Sun, 16 May 2010 16:11
11 lines
1263 bytes
1263 bytes
On 2010-05-16, Stachu 'Dozzie' K. <dozzie@go.eat.some.screws.spammer.invalid> wrote: > P.S. Zna ktoś lepszy sposób? Obawiam się że takie konstruowanie regexpa > może w pewnym momencie wyczerpać RAM. Użyć Regexp::List. depesz -- Linkedin: http://www.linkedin.com/in/depesz / blog: http://www.depesz.com/ jid/gtalk: depesz@depesz.com / aim:depeszhdl / skype:depesz_hdl / gg:6749007
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads