🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
8 messages
8 total messages Started by tomjas Sat, 28 Jan 2012 19:00
Akademicki problem z funkcja split
#52368
Author: tomjas
Date: Sat, 28 Jan 2012 19:00
16 lines
1302 bytes
Witam.
Próbuję sobie przypomnieć regexpy korzystając z perlretut. I mam problem
z funkcją split, a mianowicie:

print join(",",split /a|b/,"12aba34ba5") # wynik: 12,,,34,,5

to chyba rozumiem (jeśli dobrze sobie tłumaczę),

print join(",",split /a+|b+/,"12aba34ba5") # to samo co wyżej - logiczne

i coś czego za diabła nie mogę zrozumieć:

print join(",",split /(a|b)+/,"12aba34ba5") # wynik: 12,a,34,a,5

Może mi ktoś łopatologicznie wytłumaczyć krok po kroku w jaki sposób
perl dopasowuje wzorzec i dzieli ten ciąg?
Re: Akademicki problem z funkcja split
#52369
Author: Stachu 'Dozzie' K.
Date: Sun, 29 Jan 2012 09:44
14 lines
1642 bytes
On 2012-01-28, tomjas <tomjas@WYTNIJTOpoczta.onet.pl> wrote:
> Próbuję sobie przypomnieć regexpy korzystając z perlretut. I mam problem
> z funkcją split, a mianowicie:
[...]
> print join(",",split /(a|b)+/,"12aba34ba5") # wynik: 12,a,34,a,5
>
> Może mi ktoś łopatologicznie wytłumaczyć krok po kroku w jaki sposób
> perl dopasowuje wzorzec i dzieli ten ciąg?

perldoc -f split, szukasz opisu dla regexpów z nawiasami.

-- 
Secunia non olet.
Stanislaw Klekot
Re: Akademicki problem z funkcja split
#52370
Author: tomjas
Date: Sun, 29 Jan 2012 13:18
23 lines
2106 bytes
On Sun, 29 Jan 2012 09:44:54 +0000 (UTC), Stachu 'Dozzie' K. wrote:
> On 2012-01-28, tomjas <tomjas@WYTNIJTOpoczta.onet.pl> wrote:
>> Próbuję sobie przypomnieć regexpy korzystając z perlretut. I mam problem
>> z funkcją split, a mianowicie:
> [...]
>> print join(",",split /(a|b)+/,"12aba34ba5") # wynik: 12,a,34,a,5
>>
>> Może mi ktoś łopatologicznie wytłumaczyć krok po kroku w jaki sposób
>> perl dopasowuje wzorzec i dzieli ten ciąg?
>
> perldoc -f split, szukasz opisu dla regexpów z nawiasami.
>
Ech... Na to, to akurat wpadłem, ale za diabła nie rozumiem.
"If the PATTERN contains parentheses, additional list elements are
created from each matching substring in the delimiter."
Tzn, rozumiem to, ale w takim razie dlaczego w powyższym przykładzie
w wyniku nie ma "b"? Ja rozumuję tak:
perl szuka po kolei w ciągu najpierw wzorca "a" - mija "12" dochodzi do
"a", dalej szuka bo we wzorcu jest "+" - następnym elementem w ciągu
jest "b" więc nie pasuje, ale pasuje "b" z wzorca - idzie dalej bo znów
"+" - dalej "a" więc nie pasuje. Zatem ciągiem rozdzielającym jest "ab",
więc do pierwszego elementu tablicy wrzuca "12", a w drugim powinien być
ciąg rozdzielający bo przecież są nawiasy. Co źle rozumiem?
Re: Akademicki problem z funkcja split
#52371
Author: Piecia aka dracorp
Date: Sun, 29 Jan 2012 17:50
9 lines
1577 bytes
Teoretycznie twój zapis powinien być równoważny temu:
#v+
'print join(",",split /[ab]+/,"12aba34ba5")
#v-
ale w wyniku daje to:
#v+
12,34,5
#v-
Czyli to co chciałeś. Przyznaję się dla mnie też nie jest to jasne.
Re: Akademicki problem z funkcja split
#52374
Author: wozniak grzegorz
Date: Sun, 29 Jan 2012 18:38
17 lines
1430 bytes
tomjas wrote:


> 
> print join(",",split /(a|b)+/,"12aba34ba5") # wynik: 12,a,34,a,5
> 
> Może mi ktoś łopatologicznie wytłumaczyć krok po kroku w jaki sposób
> perl dopasowuje wzorzec i dzieli ten ciąg?

mi wydaje się to jasne: w nawiasie mam pojedyncze znaki "a" lub "b" wiec
szukam ciągów składających się z tych znaków bo mam "+" a  zwracam ostatni
znaleziony w znalezionym ciągu bo plus jest poza nawiasem

-- 
Pozdrawiam
Grzegorz Woźniak
xmpp:skinek_at_jabster_pl
Re: Akademicki problem z funkcja split
#52375
Author: wozniak grzegorz
Date: Sun, 29 Jan 2012 18:39
21 lines
1563 bytes
wozniak grzegorz wrote:

> tomjas wrote:
> 
> 
>> 
>> print join(",",split /(a|b)+/,"12aba34ba5") # wynik: 12,a,34,a,5
>> 
>> Może mi ktoś łopatologicznie wytłumaczyć krok po kroku w jaki sposób
>> perl dopasowuje wzorzec i dzieli ten ciąg?
> 
> mi wydaje się to jasne: w nawiasie mam pojedyncze znaki "a" lub "b" wiec
> szukam ciągów składających się z tych znaków bo mam "+" a  zwracam ostatni
> znaleziony w znalezionym ciągu bo plus jest poza nawiasem 
             ^^^^^^^^^^
        pasującym ciągu :)

-- 
Pozdrawiam
Grzegorz Woźniak
xmpp:skinek_at_jabster_pl
Re: Akademicki problem z funkcja split
#52372
Author: Andrzej Adam Filip
Date: Sun, 29 Jan 2012 18:43
33 lines
2674 bytes
tomjas <tomjas@WYTNIJTOpoczta.onet.pl> pisze:
> On Sun, 29 Jan 2012 09:44:54 +0000 (UTC), Stachu 'Dozzie' K. wrote:
>> On 2012-01-28, tomjas <tomjas@WYTNIJTOpoczta.onet.pl> wrote:
>>> Próbuję sobie przypomnieć regexpy korzystając z perlretut. I mam problem
>>> z funkcją split, a mianowicie:
>> [...]
>>> print join(",",split /(a|b)+/,"12aba34ba5") # wynik: 12,a,34,a,5
>>>
>>> Może mi ktoś łopatologicznie wytłumaczyć krok po kroku w jaki sposób
>>> perl dopasowuje wzorzec i dzieli ten ciąg?
>>
>> perldoc -f split, szukasz opisu dla regexpów z nawiasami.
>>
> Ech... Na to, to akurat wpadłem, ale za diabła nie rozumiem.
> "If the PATTERN contains parentheses, additional list elements are
> created from each matching substring in the delimiter."
> Tzn, rozumiem to, ale w takim razie dlaczego w powyższym przykładzie
> w wyniku nie ma "b"? Ja rozumuję tak:
> perl szuka po kolei w ciągu najpierw wzorca "a" - mija "12" dochodzi do
> "a", dalej szuka bo we wzorcu jest "+" - następnym elementem w ciągu
> jest "b" więc nie pasuje, ale pasuje "b" z wzorca - idzie dalej bo znów
> "+" - dalej "a" więc nie pasuje. Zatem ciągiem rozdzielającym jest "ab",
> więc do pierwszego elementu tablicy wrzuca "12", a w drugim powinien być
> ciąg rozdzielający bo przecież są nawiasy. Co źle rozumiem?

Widać perl daje ci jako element zwracany przez split ostatni element
tego do czego pasuje (a|b)+ [ostatnie a lub b w ciągu].

Zobacz co ci zwróci:
print join(",",split /((a|b)+)/,"12aba34ba5")

Po prostu wpadłeś na niezbyt intuicyjne, trudne do krótkiego wyjaśnienia
"detale implementacji".
Re: Akademicki problem z funkcja split
#52373
Author: Stachu 'Dozzie' K.
Date: Mon, 30 Jan 2012 00:03
26 lines
2415 bytes
On 2012-01-29, tomjas <tomjas@WYTNIJTOpoczta.onet.pl> wrote:
> On Sun, 29 Jan 2012 09:44:54 +0000 (UTC), Stachu 'Dozzie' K. wrote:
>> On 2012-01-28, tomjas <tomjas@WYTNIJTOpoczta.onet.pl> wrote:
>>> Próbuję sobie przypomnieć regexpy korzystając z perlretut. I mam problem
>>> z funkcją split, a mianowicie:
>> [...]
>>> print join(",",split /(a|b)+/,"12aba34ba5") # wynik: 12,a,34,a,5
>>>
>>> Może mi ktoś łopatologicznie wytłumaczyć krok po kroku w jaki sposób
>>> perl dopasowuje wzorzec i dzieli ten ciąg?
>>
>> perldoc -f split, szukasz opisu dla regexpów z nawiasami.
>>
> Ech... Na to, to akurat wpadłem, ale za diabła nie rozumiem.
> "If the PATTERN contains parentheses, additional list elements are
> created from each matching substring in the delimiter."
> Tzn, rozumiem to, ale w takim razie dlaczego w powyższym przykładzie
> w wyniku nie ma "b"?

A powtórzenie masz dla całej grupy czy dla czegoś wewnątrz grupy? Nie
dziw się, że powtórzenie całej grupy jest dziwnie zapisywane w zmiennych
$<number>.

-- 
Secunia non olet.
Stanislaw Klekot
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