🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
12 messages
12 total messages Started by piecia aka draco Fri, 24 Feb 2012 11:50
Odpowiednik funkcji source z basha
#51300
Author: piecia aka draco
Date: Fri, 24 Feb 2012 11:50
42 lines
911 bytes
Witam
Jako że w perlu nie zadziała coś takiego:
#v+
`bash -c "source plik"`;
print $ENV{var};
#v-
napisałem funkcję która po części realizuje wczytywanie zmiennych z
plików do hasha:

#v+
my %env;
sub source_file { #{{{
    my ($file) = @_;
    open my ($fh), q{<}, $file
        or croak "$!";
ENV:
    while (<$fh>) {
        chomp;
        my ($key, $value);
        unless ( ($key, $value) = m/\A\s*(\w+)\s*=\s*([^#]+)\z/xms ){
            next ENV;
        }

        $value =~ s{\A"?([^"]+)"?\z}{$1}xms;
        $env{$key} = $value;
    }
    return ;
}
#v-
Zmienne są wczytywane do hasha %env. Problem występuje gdy w pliku
zmienna przyjmie np. postać:
#v+
var=$pkgevr-$pkgrel
var=${pkgver}.${pkgrel}
#v-
I inne kombinacje. Gdzie zmienna może być objęta przez {} lub nie.
Pytanie jak się najlepiej do tego zabrać?

--
piecia aka dracorp
pisz na: piotr kropka rogoza at wp kropka eu

Re: Odpowiednik funkcji source z basha
#51301
Author: "Stachu 'Dozzie'
Date: Fri, 24 Feb 2012 11:59
43 lines
968 bytes
On 2012-02-24, piecia aka dracorp <imie.nazwisko@wp.eu> wrote:
> Witam
> Jako �e w perlu nie zadzia�a co� takiego:
> #v+
> `bash -c "source plik"`;
> print $ENV{var};
> #v-
> napisa�em funkcj� kt�ra po cz�ci realizuje wczytywanie zmiennych z
> plik�w do hasha:

  * YAML/YAML::Syck
  * JSON
  * Text::CSV/Tie::Array::CSV

> #v+
> my %env;
> sub source_file { #{{{
>     my ($file) = @_;
[...]
>         $env{$key} = $value;
>     }
>     return ;
> }
> #v-

Tak si� nie robi. Deklarujesz %env wewn�trz funkcji i zwracasz %env
(albo referencj� do tego).

> Zmienne s� wczytywane do hasha %env. Problem wyst�puje gdy w pliku
> zmienna przyjmie np. posta�:
> #v+
> var=$pkgevr-$pkgrel
> var=${pkgver}.${pkgrel}
> #v-
> I inne kombinacje. Gdzie zmienna mo�e by� obj�ta przez {} lub nie.
> Pytanie jak si� najlepiej do tego zabra�?

Nie papra� samemu. Zale�y do czego tego potrzebujesz.

--
Secunia non olet.
Stanislaw Klekot

Re: Odpowiednik funkcji source z basha
#51302
Author: piecia aka draco
Date: Fri, 24 Feb 2012 12:10
17 lines
517 bytes
Dnia Fri, 24 Feb 2012 11:59:06 +0000, Stachu 'Dozzie' K. napisał(a):

>   * YAML/YAML::Syck * JSON * Text::CSV/Tie::Array::CSV
Zaraz sprawdzę.

> Tak się nie robi. Deklarujesz %env wewnątrz funkcji i zwracasz %env
> (albo referencję do tego).
Czasem się zapomina o takich szczegółach.

> Nie paprać samemu. Zależy do czego tego potrzebujesz.
Jak najbardziej. Tylko czasem chciało by się aby nie uzależniać od
dodatkowych modułów.

--
piecia aka dracorp
pisz na: piotr kropka rogoza at wp kropka eu

Re: Odpowiednik funkcji source z basha
#51303
Author: "Stachu 'Dozzie'
Date: Fri, 24 Feb 2012 12:19
24 lines
812 bytes
On 2012-02-24, piecia aka dracorp <imie.nazwisko@wp.eu> wrote:
> Dnia Fri, 24 Feb 2012 11:59:06 +0000, Stachu 'Dozzie' K. napisa�(a):
>
>>   * YAML/YAML::Syck * JSON * Text::CSV/Tie::Array::CSV
> Zaraz sprawdz�.
>
>> Tak si� nie robi. Deklarujesz %env wewn�trz funkcji i zwracasz %env
>> (albo referencj� do tego).
> Czasem si� zapomina o takich szczeg�ach.

TO NIE JEST SZCZEGӣ. To jest podstawowa rzecz w programowaniu
proceduralnym.

>> Nie papra� samemu. Zale�y do czego tego potrzebujesz.
> Jak najbardziej. Tylko czasem chcia�o by si� aby nie uzale�nia� od
> dodatkowych modu��w.

Akurat ty, patrz�c na tw�j kod i na to, jak pami�tasz o niekt�rych
podstawowych sprawach, lepiej u�ywaj tak du�o modu��w, jak si� da.

--
Secunia non olet.
Stanislaw Klekot

Re: Odpowiednik funkcji source z basha
#51304
Author: piecia aka draco
Date: Fri, 24 Feb 2012 14:40
90 lines
2476 bytes
Dnia Fri, 24 Feb 2012 12:19:11 +0000, Stachu 'Dozzie' K. napisał(a):

> TO NIE JEST SZCZEGÓŁ. To jest podstawowa rzecz w programowaniu
> proceduralnym.

Oj tam stachu się unosisz. Ja rozumiem, że ty jesteś nieomylny i tego 
samego oczekujesz od innych ale wyluzuj się.
Odnośnie samego tematu. Głównie chodzi mi o wczytanie zmiennych i ich 
ewentualną ewaluację.
Weźmy poniższy przykład:
#v+
#!/usr/bin/env perl
use strict;
use warnings;

open my ($fh), q{<}, 'PKGBUILD' or croak;
my @env;

    my ($key, $value);
    while (<$fh>){
        unless ( ($key, $value) = m/\A\s*(\w+)\s*=\s*([^#]+)\z/xms ){
            next;
        }
        $value =~ s{\A"?([^"]+)"?\z}{$1}xms;
            chomp $value;
            {
                no strict 'refs';
                $$key = $value;
            }
            push @env, $key;
    }
    foreach my $var (@env){
        {
            no strict 'refs';
            print "$var = $$var\n";
        }
    }
#v-
Da dla przykładowego pliku PKGBUILD:
http://aur.archlinux.org/packages/at/atftp/PKGBUILD
taki wynik:
#v+
pkgname = atftp
_pkgver = 0.7
_patchver = 11
pkgver = ${_pkgver}.${_patchver}
pkgrel = 1
pkgdesc = "a client/server implementation of the TFTP protocol that 
implements RFCs 1350, 2090, 2347, 2348, and 2349"
arch = ('i686' 'x86_64')
url = "http://freshmeat.net/projects/atftp/"
license = ('GPL')
depends = ('pcre' 'readline')
makedepends = ('bash' 'gcc')
conflicts = ('netkit-tftp')
replaces = ('netkit-tftp')
backup = ("etc/conf.d/atftpd")
install = 
source = ("http://ftp.debian.org/debian/pool/main/a/atftp/atftp_
${_pkgver}.dfsg.orig.tar.gz"
md5sums = ('aa269044a6f992eca78fee2f6119643c'
#v-
czyli prawie dobrze.
Teraz dobrze było by podstawić zmienne pod wartości innych zmiennych. 
Jednak dopisanie np. tego:
#v+
{
no strict 'refs';
if ( $value =~ m/\A\$/xms ){
    $$key = eval "$value";
}
else{
    $$key = $value;
}
}
#v-
Nie rozwiązuje sprawy. Po uruchomieniu:
#v+
Variable "$_pkgver" is not imported at (eval 1) line 1, <$fh> line 6.
Variable "$_patchver" is not imported at (eval 1) line 2, <$fh> line 6.
Can't use string ("pkgver") as a SCALAR ref while "strict refs" in use 
at ./test.pl line 17, <$fh> line 6
#v-
W jaki sposób mogę ewaluować tylko zmienne, bez interpretacji wyrażeń 
arytmetycznych? Fakt że każdą wartość można traktować jako zbiór rekordów 
CSV i dopiero wtedy się do tego dobrać. 
Eval jako przykład więc Stachu się nie gorączkuj.
-- 
Piecia

Re: Odpowiednik funkcji source z basha
#51305
Author: piecia aka draco
Date: Fri, 24 Feb 2012 14:59
20 lines
272 bytes
No dobra jak na razie to działa:
#v+
if ( $value =~ m/\A\$/xms ){
    $value =~ s{
        \$\{?([_a-zA-Z0-9]+)\}?
    }{
        no strict 'refs';
        if (defined $$1){
            $$1;
        }
        else {
            "";
        }
    }egx;
}
#v-

--
Piecia

Re: Odpowiednik funkcji source z basha
#51306
Author: "Stachu 'Dozzie'
Date: Fri, 24 Feb 2012 15:04
28 lines
648 bytes
On 2012-02-24, piecia aka dracorp <imie.nazwisko@wp.eu> wrote:
> No dobra jak na razie to dzia�a:
> #v+
> if ( $value =~ m/\A\$/xms ){
>     $value =~ s{
>         \$\{?([_a-zA-Z0-9]+)\}?
>     }{
>         no strict 'refs';
>         if (defined $$1){
>             $$1;
>         }
>         else {
>             "";
>         }
>     }egx;
> }
> #v-

Zdajesz sobie spraw� z tego, �e tw�j kod jest paskudny, okropny
i powinno si� za taki ucina� autorowi r�ce?

Zabrali twojemu Perlowi %hasze, �e starannie unikasz ich u�ywania
i zamiast tego pieprzysz si� z evalem i `no strict refs'?

--
Secunia non olet.
Stanislaw Klekot

Re: Odpowiednik funkcji source z basha
#51307
Author: piecia aka draco
Date: Fri, 24 Feb 2012 15:20
13 lines
483 bytes
> Zdajesz sobie sprawę z tego, że twój kod jest paskudny, okropny i
> powinno się za taki ucinać autorowi ręce?
Oj wybacz że uraziłem twoje uczucia. Jak masz tasak to przyjeżdżaj i tnij
panie ideał.

> Zabrali twojemu Perlowi %hasze, że starannie unikasz ich używania i
> zamiast tego pieprzysz się z evalem i `no strict refs'?
To jest fragment, nie całość i to nie właściwego kodu. A po za tym
wszystko w porządku? Jakieś zaburzenia osobowości?

--
Piecia

Re: Odpowiednik funkcji source z basha
#51308
Author: "Stachu 'Dozzie'
Date: Fri, 24 Feb 2012 15:29
27 lines
1130 bytes
On 2012-02-24, piecia aka dracorp <imie.nazwisko@wp.eu> wrote:
>> Zdajesz sobie spraw� z tego, �e tw�j kod jest paskudny, okropny i
>> powinno si� za taki ucina� autorowi r�ce?
> Oj wybacz �e urazi�em twoje uczucia. Jak masz tasak to przyje�d�aj i tnij
> panie idea�.
>
>> Zabrali twojemu Perlowi %hasze, �e starannie unikasz ich u�ywania i
>> zamiast tego pieprzysz si� z evalem i `no strict refs'?
> To jest fragment, nie ca�o�� i to nie w�a�ciwego kodu. A po za tym
> wszystko w porz�dku? Jakie� zaburzenia osobowo�ci?

Widzisz, to przez takich jak ty Perl jest uwa�any za j�zyk
ba�aganiarski. Nie umie taki jeden z drugim programowa� w Perlu, ale
mimo to pisze w Perlu. I jeszcze nie rozumie, co zrobi� �le nawet gdy
jest mu to wytkni�te.

Ten tw�j "fragment" nale�a�oby przepisa� tak, �eby wygl�da� przyzwoicie,
a nie jak psu z gard�a. Wtedy mo�na my�le� o poprawianiu tak, �eby
dzia�a� jak oczekiwano.

Przepraszam bardzo, ale nawet m�j kod z pocz�tk�w pracy z Perlem
wygl�da� lepiej.

--
Secunia non olet.
Stanislaw Klekot

Re: Odpowiednik funkcji source z basha
#51309
Author: piecia aka draco
Date: Fri, 24 Feb 2012 16:58
27 lines
1004 bytes
Dnia Fri, 24 Feb 2012 15:29:56 +0000, Stachu 'Dozzie' K. napisał(a):

> Widzisz, to przez takich jak ty Perl jest uważany za język
> bałaganiarski.
W ten sam sposób można mówić o każdym języku. A wiesz że Polacy kradną?

> Nie umie taki jeden z drugim programować w Perlu, ale
> mimo to pisze w Perlu. I jeszcze nie rozumie, co zrobił źle nawet gdy
> jest mu to wytknięte.
Jakoś nie przypominam sobie żebyś napisał jakąś książkę związaną z
Perlem. A jakoś kolący cię w oko "no strict 'refs'" inni nie zabraniają
stosować a do tego użyłem {}.

> Przepraszam bardzo, ale nawet mój kod z początków pracy z Perlem
> wyglądał lepiej.
O wybacz kwintesencjo doskonałości, że zburzyłem twój porządek.

Cieszę się że w życiu nie miałem jako nauczyciela kogoś takiego jak ty.
Może masz wiedzę Stachu ale sposób w jaki ją przekazujesz innym ludziom
jest żałosny.

Z mojej strony EOT.

--
piecia aka dracorp
pisz na: piotr kropka rogoza at wp kropka eu

Re: Odpowiednik funkcji source z basha
#51310
Author: =?UTF-8?Q?SÅ=8
Date: Fri, 24 Feb 2012 18:06
17 lines
495 bytes
Aha. piecia aka dracorp, kopsnij nam wyp�osza i znikamy.

[...]
> Da dla przyk�adowego pliku PKGBUILD:
> http://aur.archlinux.org/packages/at/atftp/PKGBUILD

Ale to znasz?

http://search.cpan.org/~juster/WWW-AUR-0.14/lib/WWW/AUR/PKGBUILD.pm

S�awek
--
  ________
_/ __/ __/ Od�� te wid�y ch�opcze! (ostatnie s�owa gracza RPG)
 \__ \__ \_______________________________________________________________
 /___/___/ S�awomir Szczyrba                          steev/AT/hot\dot\pl

Re: Odpowiednik funkcji source z basha
#51311
Author: piecia aka draco
Date: Fri, 24 Feb 2012 19:29
14 lines
269 bytes
Dnia Fri, 24 Feb 2012 18:06:28 +0100, Sławomir Szczyrba napisał(a):

> Ale to znasz?
> http://search.cpan.org/~juster/WWW-AUR-0.14/lib/WWW/AUR/PKGBUILD.pm

Nie nie znam. Dzięki za informację.




--
piecia aka dracorp
pisz na: piotr kropka rogoza at wp kropka eu

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