Thread View: pl.comp.lang.perl
15 messages
15 total messages
Started by Luk
Thu, 07 May 2009 07:26
Konkatenacja
Author: Luk
Date: Thu, 07 May 2009 07:26
Date: Thu, 07 May 2009 07:26
25 lines
1438 bytes
1438 bytes
Przykład tandetny ale mam coś takiego do wykonania: Kultura w dzisiejszych czasach to rzadkosc Nowak Jan Gdy za oknem slonce dusza sie raduje Wozniak Anna Znajdz cel znajdziesz droge Kuzniak Marcin Pomógł by mi ktoś tak żeby linie wyglądały następująco: Kultura w dzisiejszych czasach to rzadkosc - Nowak Jan Gdy za oknem slonce dusza sie raduje - Wozniak Anna Znajdz cel znajdziesz droge - Kuzniak Marcin Większość już mam zrobione ale mam własnie problem z złączeniem. Dzięki. -- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Re: Konkatenacja
Author: Maciej Misiak
Date: Thu, 07 May 2009 07:42
Date: Thu, 07 May 2009 07:42
13 lines
1312 bytes
1312 bytes
> Większość już mam zrobione ale mam własnie problem z złączeniem. > Dzięki. Jeśli masz je w zmiennych $txt1, $txt2, $txt3, to złączenie wygląda tak: $wynik = $txt1 . $txt2 . $txt3; A jeżeli w tablicy @arr, to analogicznie: $wynik = $arr[0] . $arr[1] . $arr[2]; -- grizzley -- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Re: Konkatenacja
Author: Mirosław Zalewski
Date: Thu, 07 May 2009 10:15
Date: Thu, 07 May 2009 10:15
33 lines
2132 bytes
2132 bytes
maj roku pamiętnego 2009, prawdopodobnie 07. Wielka mądrość na
czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Maciej Misiak:
> > Większość już mam zrobione ale mam własnie problem z złączeniem.
> > Dzięki.
>
> Jeśli masz je w zmiennych $txt1, $txt2, $txt3, to złączenie wygląda
> tak: $wynik = $txt1 . $txt2 . $txt3;
> A jeżeli w tablicy @arr, to analogicznie:
> $wynik = $arr[0] . $arr[1] . $arr[2];
Przy założeniu że te zmienne nie kończą się znakiem nowej linii, co
przecież może się zdarzyć. Ja kiedyś korzystałem z takiej prostej
funkcji:
sub trim {
my $string = shift;
$string =~ s/^[\s\n\r]+//;
$string =~ s/[\s\n\r]+$//;
return $string;
}
I potem wywołanie wygląda tak
$wynik = trim($txt1) . trim($txt2) . trim($txt3);
Teraz pomyślałem, że alternatywnie można zmienną $wynik przy pomocy
s/// pozbyć wszelkich znaków nowej linii. Osobiście zamieniłbym je na
zwykłe spacje, a później jeszcze wszystkie spacje występujące
kilkukrotnie pod rząd (bo mogą się takie pojawić) zamienił na spacje
pojedyncze.
--
Niżej podpisany, zamieszkały w http://minio.xt.pl ,
Mirosław Zalewski
Re: Konkatenacja
Author: Stachu 'Dozzie' K.
Date: Thu, 07 May 2009 10:22
Date: Thu, 07 May 2009 10:22
36 lines
2218 bytes
2218 bytes
On 07.05.2009, Mirosław Zalewski wrote:
> maj roku pamiętnego 2009, prawdopodobnie 07. Wielka mądrość na
> czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Maciej Misiak:
>
>> > Większość już mam zrobione ale mam własnie problem z złączeniem.
>> > Dzięki.
>>
>> Jeśli masz je w zmiennych $txt1, $txt2, $txt3, to złączenie wygląda
>> tak: $wynik = $txt1 . $txt2 . $txt3;
>> A jeżeli w tablicy @arr, to analogicznie:
>> $wynik = $arr[0] . $arr[1] . $arr[2];
>
> Przy założeniu że te zmienne nie kończą się znakiem nowej linii, co
> przecież może się zdarzyć. Ja kiedyś korzystałem z takiej prostej
> funkcji:
>
> sub trim {
> my $string = shift;
> $string =~ s/^[\s\n\r]+//;
> $string =~ s/[\s\n\r]+$//;
> return $string;
> }
>
> I potem wywołanie wygląda tak
> $wynik = trim($txt1) . trim($txt2) . trim($txt3);
>
> Teraz pomyślałem, że alternatywnie można zmienną $wynik przy pomocy
> s/// pozbyć wszelkich znaków nowej linii. Osobiście zamieniłbym je na
> zwykłe spacje, a później jeszcze wszystkie spacje występujące
> kilkukrotnie pod rząd (bo mogą się takie pojawić) zamienił na spacje
> pojedyncze.
Znaczy zrobił `$wynik = join " ", split " ", $txt1, $txt2, $txt3'?
--
Stanislaw Klekot
Re: Konkatenacja
Author: Mirosław Zalewski
Date: Thu, 07 May 2009 10:48
Date: Thu, 07 May 2009 10:48
16 lines
1670 bytes
1670 bytes
maj roku pamiętnego 2009, prawdopodobnie 07. Wielka mądrość na
czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Stachu
'Dozzie' K.:
> > Teraz pomyślałem, że alternatywnie można zmienną $wynik przy pomocy
> > s/// pozbyć wszelkich znaków nowej linii. Osobiście zamieniłbym je
> > na zwykłe spacje, a później jeszcze wszystkie spacje występujące
> > kilkukrotnie pod rząd (bo mogą się takie pojawić) zamienił na spacje
> > pojedyncze.
>
> Znaczy zrobił `$wynik = join " ", split " ", $txt1, $txt2, $txt3'?
„There's more than one way to do it.” ;)
--
Niżej podpisany, zamieszkały w http://minio.xt.pl ,
Mirosław Zalewski
Re: Konkatenacja
Author: Stachu 'Dozzie' K.
Date: Thu, 07 May 2009 10:59
Date: Thu, 07 May 2009 10:59
19 lines
1744 bytes
1744 bytes
On 07.05.2009, Mirosław Zalewski wrote: > maj roku pamiętnego 2009, prawdopodobnie 07. Wielka mądrość na > czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Stachu > 'Dozzie' K.: > >> > Teraz pomyślałem, że alternatywnie można zmienną $wynik przy pomocy >> > s/// pozbyć wszelkich znaków nowej linii. Osobiście zamieniłbym je >> > na zwykłe spacje, a później jeszcze wszystkie spacje występujące >> > kilkukrotnie pod rząd (bo mogą się takie pojawić) zamienił na spacje >> > pojedyncze. >> >> Znaczy zrobił `$wynik = join " ", split " ", $txt1, $txt2, $txt3'? > > ???There's more than one way to do it.??? ;) A niby z czego się golf wziął? ;P -- Stanislaw Klekot
Re: Konkatenacja
Author: Piotr Fusik
Date: Thu, 07 May 2009 11:45
Date: Thu, 07 May 2009 11:45
16 lines
1291 bytes
1291 bytes
Stachu 'Dozzie' K. <dozzie@dynamit.im.pwr.wroc.pl.nospam> napisał(a): > A niby z czego się golf wziął? ;P > Zgłaszam rozwiązanie: #!perl -lp00 s/.+\s*$/- $&/;y/ / / Pozdrawiam, 0xF -- Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: Konkatenacja
Author: Stachu 'Dozzie' K.
Date: Thu, 07 May 2009 11:53
Date: Thu, 07 May 2009 11:53
17 lines
1386 bytes
1386 bytes
On 07.05.2009, Piotr Fusik wrote: > Stachu 'Dozzie' K. <dozzie@dynamit.im.pwr.wroc.pl.nospam> napisał(a): > >> A niby z czego się golf wziął? ;P >> > Zgłaszam rozwiązanie: > > #!perl -lp00 > s/.+\s*$/- $&/;y/ > / / Fakt. #!perl -pl0 s/\s+/ /g -- Stanislaw Klekot
Re: Konkatenacja
Author: Szymon Sokół
Date: Thu, 07 May 2009 16:49
Date: Thu, 07 May 2009 16:49
48 lines
2828 bytes
2828 bytes
On Thu, 7 May 2009 12:15:59 +0200, Mirosław Zalewski wrote:
> maj roku pamiętnego 2009, prawdopodobnie 07. Wielka mądrość na
> czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Maciej Misiak:
>
>>> Większość już mam zrobione ale mam własnie problem z złączeniem.
>>> Dzięki.
>>
>> Jeśli masz je w zmiennych $txt1, $txt2, $txt3, to złączenie wygląda
>> tak: $wynik = $txt1 . $txt2 . $txt3;
>> A jeżeli w tablicy @arr, to analogicznie:
>> $wynik = $arr[0] . $arr[1] . $arr[2];
To nie jest rozwiązanie problemu OP, bo pomija '-' przed autorem. Oczywiście
zmiana jest trywialna. Gdyby jednak ten '-' nie był potrzebny, to w celu
skonkatenowania elementów @arr ja jednak napisałbym:
$wynik = join '', @arr;
(a gdyby chodziło o dokładnie pierwsze 3 elementy, to @arr[0..2])
> $string =~ s/^[\s\n\r]+//;
> $string =~ s/[\s\n\r]+$//;
A nie lepiej jednym regexpem?
$string =~ s/^\s*(.*?)\s*$/$1/;
(dla ustalenia uwagi, definicja \s zawiera \n i \r)
> I potem wywołanie wygląda tak
> $wynik = trim($txt1) . trim($txt2) . trim($txt3);
A jakby tę funkcję zdefiniować tak:
sub trim {
return unless defined wantarray;
my @parms = @_;
for (@parms) { s/^\s*(.*?)\s*$/$1/ }
return wantarray ? @parms : "@parms";
}
to można by wywołać:
$wynik = trim($txt1, $txt2, $txt3);
--
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: Konkatenacja
Author: Mirosław Zalewski
Date: Thu, 07 May 2009 17:33
Date: Thu, 07 May 2009 17:33
35 lines
2116 bytes
2116 bytes
maj roku pamiętnego 2009, prawdopodobnie 07. Wielka mądrość na
czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Szymon Sokół:
>
> > $string =~ s/^[\s\n\r]+//;
> > $string =~ s/[\s\n\r]+$//;
>
> A nie lepiej jednym regexpem?
> $string =~ s/^\s*(.*?)\s*$/$1/;
Nie wiem; z tego co pamiętam ktoś gdzieś (perlmonks?) stwierdził że
takie dwa regexpy są szybsze niż jeden, co przyjąłem na wiarę.
> (dla ustalenia uwagi, definicja \s zawiera \n i \r)
Nie wiedziałem, dzięki za uwagę.
> > I potem wywołanie wygląda tak
> > $wynik = trim($txt1) . trim($txt2) . trim($txt3);
>
> A jakby tę funkcję zdefiniować tak:
> sub trim {
> return unless defined wantarray;
> my @parms = @_;
> for (@parms) { s/^\s*(.*?)\s*$/$1/ }
> return wantarray ? @parms : "@parms";
> }
> to można by wywołać:
> $wynik = trim($txt1, $txt2, $txt3);
Akurat w moim przypadku i tak ta funkcja zawsze jest wywoływana na
jednym łańcuchu znaków, ale może wątkotwórcy się przyda.
--
Niżej podpisany, zamieszkały w http://minio.xt.pl ,
Mirosław Zalewski
Re: Konkatenacja
Author: Vava
Date: Thu, 07 May 2009 18:22
Date: Thu, 07 May 2009 18:22
62 lines
2275 bytes
2275 bytes
Dnia 07-05-2009 o 19:33:03 Mirosław Zalewski <miniopl@cut_this.gmail.com>
napisał(a):
> maj roku pamiętnego 2009, prawdopodobnie 07. Wielka mądrość na
> czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Szymon Sokół:
>
>>
>> > $string =~ s/^[\s\n\r]+//;
>> > $string =~ s/[\s\n\r]+$//;
>>
>> A nie lepiej jednym regexpem?
>> $string =~ s/^\s*(.*?)\s*$/$1/;
>
> Nie wiem; z tego co pamiętam ktoś gdzieś (perlmonks?) stwierdził że
> takie dwa regexpy są szybsze niż jeden, co przyjąłem na wiarę.
Zależy od zawartości obcinanych stringów - dla krótkich szybszy będzie
pojedyńczy regexp:
#!/usr/bin/perl
use Benchmark qw/:all/;
cmpthese (100000, {
One => sub {
$a = ' sdfsdf ';
$a =~ s/^\s*(.*?)\s*$/$1/;
},
Two => sub {
$a =~ s/^\s*//;
$a =~ s/\s*$//;
},
});
AMD64 X2, Fedora:
Rate One Two
One 169492/s -- -47%
Two 322581/s 90% --
Intel Atom, Win XP:
Rate One Two
One 62150/s -- -57%
Two 145560/s 134% --
Dla długich (zmiana na $a = ' sdfsdf 'x1000;) nieco szybsze są dwa
(tylko desktop, na netoboku mi się nie chciało czekać):
Rate One Two
Two 299/s -- -19%
One 369/s 24% --
Pozdrawiam
--
Vava
Wawrzyniec Żurowski
Victoria vale, et ubique es, suaviter sternutas
Re: Konkatenacja
Author: Szymon Sokół
Date: Thu, 07 May 2009 20:14
Date: Thu, 07 May 2009 20:14
11 lines
1807 bytes
1807 bytes
On Thu, 07 May 2009 20:22:14 +0200, Vava wrote: > Zależy od zawartości obcinanych stringów - dla krótkich szybszy będzie > pojedyńczy regexp: Chyba właśnie odwrotnie? Tak wynikałoby z liczb, które przytoczyłeś... -- 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: Konkatenacja
Author: Vava
Date: Thu, 07 May 2009 20:42
Date: Thu, 07 May 2009 20:42
16 lines
1426 bytes
1426 bytes
Dnia 07-05-2009 o 22:14:37 Szymon Sokół <szymon@bastard.operator.from.hell.pl> napisał(a): > On Thu, 07 May 2009 20:22:14 +0200, Vava wrote: > >> Zależy od zawartości obcinanych stringów - dla krótkich szybszy będzie >> pojedyńczy regexp: > Chyba właśnie odwrotnie? Tak wynikałoby z liczb, które przytoczyłeś... Oczywiście Pozdrawiam -- Vava Wawrzyniec Żurowski Victoria vale, et ubique es, suaviter sternutas
Re: Konkatenacja
Author: Stachu 'Dozzie' K.
Date: Fri, 08 May 2009 06:14
Date: Fri, 08 May 2009 06:14
12 lines
1495 bytes
1495 bytes
On 07.05.2009, Szymon Sokół wrote: > On Thu, 07 May 2009 20:22:14 +0200, Vava wrote: > >> Zależy od zawartości obcinanych stringów - dla krótkich szybszy będzie >> pojedyńczy regexp: > Chyba właśnie odwrotnie? Tak wynikałoby z liczb, które przytoczyłeś... Ciekawe jak się będzie miał s/^\s+|\s+$//g do s/^\s*(.*?)\s*$/$1/. Nie chce mi się teraz sprawdzać ;P -- Stanislaw Klekot
Re: Konkatenacja
Author: Maciej Misiak
Date: Sat, 09 May 2009 11:55
Date: Sat, 09 May 2009 11:55
22 lines
1995 bytes
1995 bytes
Mirosław Zalewski pisze: > maj roku pamiętnego 2009, prawdopodobnie 07. Wielka mądrość na > czytelników pl.comp.lang.perl spłynęła, gdy tako rzekł(a) Maciej Misiak: > >>> Większość już mam zrobione ale mam własnie problem z złączeniem. >>> Dzięki. >> Jeśli masz je w zmiennych $txt1, $txt2, $txt3, to złączenie wygląda >> tak: $wynik = $txt1 . $txt2 . $txt3; >> A jeżeli w tablicy @arr, to analogicznie: >> $wynik = $arr[0] . $arr[1] . $arr[2]; > > Przy założeniu że te zmienne nie kończą się znakiem nowej linii, co > przecież może się zdarzyć. Ja kiedyś korzystałem z takiej prostej > funkcji: Wow, ale się grupa ożywiła, ale to dobrze :) Ja zrozumiałem z treści pytania, że linie już są jakoś tam wczytane, a pytający po prostu ma problem z ich złączeniem, czyli nie wie w jaki sposób łączy się stringi w jeden i stąd skupiłem się na konkatenacji :) -- grizzley
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