🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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?
#51886
Author: ag :)
Date: Sun, 16 May 2010 08:23
11 lines
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?
#51887
Author: Stachu 'Dozzie' K.
Date: Sun, 16 May 2010 08:47
42 lines
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?
#51889
Author: Szymon Sokół
Date: Sun, 16 May 2010 09:17
32 lines
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?
#51888
Author: hubert depesz lubaczewski
Date: Sun, 16 May 2010 16:11
11 lines
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