🚀 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 dracorp Fri, 24 Feb 2012 11:50
Odpowiednik funkcji source z basha
#52405
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 11:50
41 lines
1866 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
#52406
Author: Stachu 'Dozzie' K.
Date: Fri, 24 Feb 2012 11:59
42 lines
2131 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
#52407
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 12:10
16 lines
1541 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
#52408
Author: Stachu 'Dozzie' K.
Date: Fri, 24 Feb 2012 12:19
23 lines
2007 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
#52409
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 14:40
89 lines
3503 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
#52410
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 14:59
19 lines
1270 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
#52411
Author: Stachu 'Dozzie' K.
Date: Fri, 24 Feb 2012 15:04
27 lines
2030 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
#52412
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 15:20
12 lines
1551 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
#52413
Author: Stachu 'Dozzie' K.
Date: Fri, 24 Feb 2012 15:29
26 lines
2550 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
#52417
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 16:58
26 lines
2368 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
#52423
Author: Sławomir Szczyrba
Date: Fri, 24 Feb 2012 17:06
16 lines
1653 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
#52425
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 19:29
13 lines
1496 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