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
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 11:50
Date: Fri, 24 Feb 2012 11:50
41 lines
1866 bytes
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
Author: Stachu 'Dozzie' K.
Date: Fri, 24 Feb 2012 11:59
Date: Fri, 24 Feb 2012 11:59
42 lines
2131 bytes
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
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 12:10
Date: Fri, 24 Feb 2012 12:10
16 lines
1541 bytes
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
Author: Stachu 'Dozzie' K.
Date: Fri, 24 Feb 2012 12:19
Date: Fri, 24 Feb 2012 12:19
23 lines
2007 bytes
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
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 14:40
Date: Fri, 24 Feb 2012 14:40
89 lines
3503 bytes
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
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 14:59
Date: Fri, 24 Feb 2012 14:59
19 lines
1270 bytes
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
Author: Stachu 'Dozzie' K.
Date: Fri, 24 Feb 2012 15:04
Date: Fri, 24 Feb 2012 15:04
27 lines
2030 bytes
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
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 15:20
Date: Fri, 24 Feb 2012 15:20
12 lines
1551 bytes
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
Author: Stachu 'Dozzie' K.
Date: Fri, 24 Feb 2012 15:29
Date: Fri, 24 Feb 2012 15:29
26 lines
2550 bytes
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
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 16:58
Date: Fri, 24 Feb 2012 16:58
26 lines
2368 bytes
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
Author: Sławomir Szczyrba
Date: Fri, 24 Feb 2012 17:06
Date: Fri, 24 Feb 2012 17:06
16 lines
1653 bytes
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
Author: piecia aka dracorp
Date: Fri, 24 Feb 2012 19:29
Date: Fri, 24 Feb 2012 19:29
13 lines
1496 bytes
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