🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
15 messages
15 total messages Started by Luk Thu, 07 May 2009 07:26
Konkatenacja
#51355
Author: Luk
Date: Thu, 07 May 2009 07:26
25 lines
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
#51356
Author: Maciej Misiak
Date: Thu, 07 May 2009 07:42
13 lines
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
#51357
Author: Mirosław Zalewski
Date: Thu, 07 May 2009 10:15
33 lines
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
#51358
Author: Stachu 'Dozzie' K.
Date: Thu, 07 May 2009 10:22
36 lines
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
#51359
Author: Mirosław Zalewski
Date: Thu, 07 May 2009 10:48
16 lines
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
#51402
Author: Stachu 'Dozzie' K.
Date: Thu, 07 May 2009 10:59
19 lines
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
#51361
Author: Piotr Fusik
Date: Thu, 07 May 2009 11:45
16 lines
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
#51362
Author: Stachu 'Dozzie' K.
Date: Thu, 07 May 2009 11:53
17 lines
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
#51363
Author: Szymon Sokół
Date: Thu, 07 May 2009 16:49
48 lines
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
#51364
Author: Mirosław Zalewski
Date: Thu, 07 May 2009 17:33
35 lines
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
#51365
Author: Vava
Date: Thu, 07 May 2009 18:22
62 lines
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
#51366
Author: Szymon Sokół
Date: Thu, 07 May 2009 20:14
11 lines
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
#51367
Author: Vava
Date: Thu, 07 May 2009 20:42
16 lines
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
#51368
Author: Stachu 'Dozzie' K.
Date: Fri, 08 May 2009 06:14
12 lines
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
#51369
Author: Maciej Misiak
Date: Sat, 09 May 2009 11:55
22 lines
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