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.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[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.pldoc.pisz.plpdf.pisz.pltejsza.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 |
|