ďťż
 
sort + regexp ďťż
 
sort + regexp
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

sort + regexp



Neon - 28-02-2006 13:18
sort + regexp
  Witam,

help!

mam tablicę składającą się z elementów typu:

aaa11.123
bbb2.11
cc1.1

chcę ją posortować uwzględniając tylko liczby po kropce. Chciałbym zrobić to
tak (na bazie 'perldoc -f sort'):

@sorted = sort {$a <=> $b} @unsorted

oczwiście do porównania muszę wydobyć interesujące części elementów tablicy
regexpem... I tu jest pytanie, jakim? Jaki regex pozwoli mi wybrać tylko
liczby po kropce i co ważne - bez kropki!

czyli @sorted = sort {$a=~/regexp/ <=> $b=~/regexp/} @unsorted

Jeżeli dobrze rozumiem, elementy tablicy nie zostaną wówczas zmienione,
regexp zadziała tylko "tymczasowo" do porównań, czy tak?

Znalazłem w google taką konstrukcję:
--------------------------------------
#!/usr/bin/perl
$filename = "filename.dat.doc";
if ( $filename =~ /\.(\w+)\z/ ) {
print "Extension is: $1\n";
}

$ ./getExt.pl
Extension is: doc
--------------------------------------

Ale nie potrafię jej wykorzystać w swoim sorcie. Wiem, że mogę operację
sortowania wykonać w inny sposób, ale pytanie, jak wydobyć liczby po kropce
z w jednym regexpie nie daje mi spokoju, pomocy :)

TIA

--
N. Neon





Stachu 'Dozzie' K. - 28-02-2006 13:18

  On 22.02.2006, Neon <neon@neon.dk> wrote:
> mam tablicę składającą się z elementów typu:
>
> aaa11.123
> bbb2.11
> cc1.1
>
> chcę ją posortować uwzględniając tylko liczby po kropce. Chciałbym zrobić to
> tak (na bazie 'perldoc -f sort'):
>
> @sorted = sort {$a <=> $b} @unsorted
>
> oczwiście do porównania muszę wydobyć interesujące części elementów tablicy
> regexpem... I tu jest pytanie, jakim? Jaki regex pozwoli mi wybrać tylko
> liczby po kropce i co ważne - bez kropki!
>
> czyli @sorted = sort {$a=~/regexp/ <=> $b=~/regexp/} @unsorted
>
> Jeżeli dobrze rozumiem, elementy tablicy nie zostaną wówczas zmienione,
> regexp zadziała tylko "tymczasowo" do porównań, czy tak?

Lepiej się zastanów, co w kontekście skalarnym zwraca trafienie
regexpem.

> Znalazłem w google taką konstrukcję:
> --------------------------------------
> #!/usr/bin/perl
> $filename = "filename.dat.doc";
> if ( $filename =~ /\.(\w+)\z/ ) {
> print "Extension is: $1\n";
> }
>
> $ ./getExt.pl
> Extension is: doc
> --------------------------------------

To aż googli było do tego trzeba? Przecież takie coś jest
w lokalnej dokumentacji (strony perlre i perlop).

> Ale nie potrafię jej wykorzystać w swoim sorcie. Wiem, że mogę operację
> sortowania wykonać w inny sposób,

I tak należy to zrobić: w inny sposób. Pamiętając, że blok kodu podawany
sortowi jako pierwszy argument, to tak naprawdę anonimowa funkcja
i można użyć tam zmiennych lokalnych (perldoc -f my).

> ale pytanie, jak wydobyć liczby po kropce
> z w jednym regexpie nie daje mi spokoju, pomocy :)

I owszem, da się to zrobić bez dodatkowych zmiennych. Co nie znaczy, że
to dobry pomysł.

--
Feel free to correct my English
Stanislaw Klekot




Artur R. Czechowski - 28-02-2006 13:18

  On 2006-02-22, Neon <neon@neon.dk> wrote:
> oczwiście do porównania muszę wydobyć interesujące części elementów tablicy
> regexpem... I tu jest pytanie, jakim? Jaki regex pozwoli mi wybrać tylko
> liczby po kropce i co ważne - bez kropki!
\.(\d+)
--
http://nerdquiz.sgh.waw.pl/




Szymon =?iso-8859-2?Q?Sok=F3=B3?= - 28-02-2006 13:18

  On Thu, 23 Feb 2006 00:30:25 +0000 (UTC), Artur R. Czechowski wrote:

> On 2006-02-22, Neon <neon@neon.dk> wrote:
>> oczwiście do porównania muszę wydobyć interesujące części elementów tablicy
>> regexpem... I tu jest pytanie, jakim? Jaki regex pozwoli mi wybrać tylko
>> liczby po kropce i co ważne - bez kropki!
> \.(\d+)

Plus zalecałbym skorzystanie ze schematu Schwartza, aż się prosi o to:
@sorted = map { $_->[0] } sort { $b->[1] <=> $a->[1] }
map { /\.(\d+)/; [$_, $1] } @unsorted;
(nietestowane, z głowy pisane, ale chyba poprawne)
--
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





Twelve Hungry Mammoths - 28-02-2006 13:18

  On Thu, 23 Feb 2006 09:59:50 +0100, Szymon Sokół
<szymon@bastard.operator.from.hell.pl> wrote:
>
>>> oczwiście do porównania muszę wydobyć interesujące części elementów
>>> tablicy
>>> regexpem... I tu jest pytanie, jakim? Jaki regex pozwoli mi wybrać
>>> tylko
>>> liczby po kropce i co ważne - bez kropki!
>> \.(\d+)
>
> Plus zalecałbym skorzystanie ze schematu Schwartza, aż się prosi o to:
> @sorted = map { $_->[0] } sort { $b->[1] <=> $a->[1] }
> map { /\.(\d+)/; [$_, $1] } @unsorted;
> (nietestowane, z głowy pisane, ale chyba poprawne)

przedwczesna optymalizacja to zrodlo wszelkiego zla. powinienes sie leczyc
(-:

pzdr
szeryf




Grzegorz Szyszlo - 06-04-2006 00:15

  Neon napisał(a):

> mam tablicę składającą się z elementów typu:
>
> aaa11.123
> bbb2.11
> cc1.1
>
> chcę ją posortować uwzględniając tylko liczby po kropce. Chciałbym zrobić to
> tak (na bazie 'perldoc -f sort'):
>
> @sorted = sort {$a <=> $b} @unsorted

heh. nieoptymalne, ale pewnie zadziala:

@sorted = sort {
$a=~/\.(\d+)^/;
my $mya=$1;
$b=~/\.(\d+)^/;
my $myb=$1;
$mya <=> $myb
} @unsorted

tez pisane z glowy. procedura nie jest zabezpieczona przed
nieodpowiednimi danymi, np. brak kropki.

znik.




=?ISO-8859-2?Q?Zbigniew_Kempczy=F1ski?= - 06-04-2006 00:15

  Użytkownik Grzegorz Szyszlo napisał:

> @sorted = sort {
> $a=~/\.(\d+)^/;
chyba ^ - $
chociaz bezpieczniej
$a=~/\.(\d+)\s*$/;

> $b=~/\.(\d+)^/;
j.w.
--
=============================
Zbigniew Kempczynski
http://it.marton.pl/wegorz/
=============================




Vava - 06-04-2006 00:15

  Grzegorz Szyszlo <znik@wbc.lublin.pl> wrote:

>> mam tablicę składającą się z elementów typu: aaa11.123
>> bbb2.11
>> cc1.1
>> chcę ją posortować uwzględniając tylko liczby po kropce. Chciałbym
>> zrobić to
>> tak (na bazie 'perldoc -f sort'):
>> @sorted = sort {$a <=> $b} @unsorted
>
> heh. nieoptymalne, ale pewnie zadziala:
>
> @sorted = sort {
> $a=~/\.(\d+)^/;
> my $mya=$1;
> $b=~/\.(\d+)^/;
> my $myb=$1;
> $mya <=> $myb
> } @unsorted
>
> tez pisane z glowy. procedura nie jest zabezpieczona przed
> nieodpowiednimi danymi, np. brak kropki.

Jak zamienisz ^ na $ to zadziała, ale czyż nie lepiej tak?

@sorted = sort {
($a =~ /.*\.(\d+)/)[0]
<=>
($b =~ /.*\.(\d+)/)[0]
} @unsorted;

Pozdrawiam
--
Vava
Wawrzyniec Żurowski
Victoria vale, et ubique es, suaviter sternutas




Piotr Fusik - 07-04-2006 00:04

  > @sorted = sort {
> * * * *($a =~ /.*\.(\d+)/)[0]
> * * * * * * * *<=>
> * * * *($b =~ /.*\.(\d+)/)[0]
> } @unsorted;
>
sub after_dot($) { ($_[0] =~ /\.(\d+)/)[0] }
@sorted = sort { after_dot($a) <=> after_dot($b) } @unsorted;

lub

my %tmp = map { $_ => (/\.(\d+)/)[0] } @unsorted;
@sorted = sort { $tmp{$a} <=> $tmp{$b} } @unsorted;

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl




Szymon =?iso-8859-2?Q?Sok=F3=B3?= - 07-04-2006 00:04

  On 6 Apr 2006 11:48:04 +0200, Piotr Fusik wrote:

> sub after_dot($) { ($_[0] =~ /\.(\d+)/)[0] }
> @sorted = sort { after_dot($a) <=> after_dot($b) } @unsorted;
>
> lub
>
> my %tmp = map { $_ => (/\.(\d+)/)[0] } @unsorted;
> @sorted = sort { $tmp{$a} <=> $tmp{$b} } @unsorted;

Ale po co wprowadzać dodatkowe procedury albo zmienne tymczasowe? Półtora
miesiąca temu (tak, znik odgrzał wątek sprzed półtora miesiąca i do tego
podał rozwiązanie gorsze niż wcześniej proponowane...) podawałem, jak to
zrobić schematem Schwartza: <weq6pou45csi.dlg@falcon.sloth.hell.pl>
--
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




Grzegorz Szyszlo - 09-04-2006 00:20

  Zbigniew Kempczyński napisał(a):
> Użytkownik Grzegorz Szyszlo napisał:
>
>> @sorted = sort {
>> $a=~/\.(\d+)^/;
> chyba ^ - $

no tak.... tr/^/$/ ;)

> chociaz bezpieczniej
> $a=~/\.(\d+)\s*$/;

jak pisalem, to przyklad nieodporny na zle dane.
nie chcialem bezsensownie zaciemniac ;)
co do zabezpieczen, wieksza ich ilosc by sie przydala.

znik.




Vava - 14-04-2006 00:03

  Szymon Sokół <szymon@bastard.operator.from.hell.pl> wrote:

> On 6 Apr 2006 11:48:04 +0200, Piotr Fusik wrote:
>
>> sub after_dot($) { ($_[0] =~ /\.(\d+)/)[0] }
>> @sorted = sort { after_dot($a) <=> after_dot($b) } @unsorted;
>>
>> lub
>>
>> my %tmp = map { $_ => (/\.(\d+)/)[0] } @unsorted;
>> @sorted = sort { $tmp{$a} <=> $tmp{$b} } @unsorted;
>
> Ale po co wprowadzać dodatkowe procedury albo zmienne tymczasowe? Półtora
> miesiąca temu (tak, znik odgrzał wątek sprzed półtora miesiąca i do tego
> podał rozwiązanie gorsze niż wcześniej proponowane...) podawałem, jak to
> zrobić schematem Schwartza: <weq6pou45csi.dlg@falcon.sloth.hell.pl>

Jakoś ominąłem wcześniej i dopiero teraz to zauważyłem ;-)

Shwartz jest wydajny, ale osobiście bym go stosował TYLKO w skrypcie,
gdzie toto znajduje się w jakiejś zagnieżdżonej pętli...
konstrukcja
map {...} sort {...} map
psuje mi czytelność kodu...

Jak wydajność nie jest kluczowa, to wolę zwykłe, proste i intuicyjne,

@posortowane = sort {
($a =~ /reg(exp)/)[0]
<=>
($b =~ /reg(exp)/)[0]
} @nieposorowane;

które jest bez zmiennych tymczasowych, zewnętrznych procedur i
zaciemnienia ;-)

Pozdrawiam
--
Vava
Wawrzyniec Żurowski
Victoria vale, et ubique es, suaviter sternutas
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [Postgres] jak zastapic brakujaca funkcje regexp_replace w PG wersji 8.0 [MySQL] REGEXP w FULL-TEXT SEARCH [MySQL] REGEXP =?UTF-8?B?ZG9rxYJhZG5pZSBkd2Egem5ha2k=?= [MySQL] REGEXP - dlaczego nie =?UTF-8?B?ZHppYcWCYQ==?= [oracle] regexp - czemu nie działa? regexp albo cos [MySQL] Regexpy regexp Photoshop [PostgreSQL] Liczba dni roboczych miedzy dwoma datami
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • tejsza.htw.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com