Article View: pl.comp.lang.perl
Article #52409Re: Odpowiednik funkcji source z basha
From: 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
Technical Details
Message-ID:
<pan.2012.02.24.14.45.53@dracorp.one.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<pan.2012.02.24.11.56.04@dracorp.one.pl> <slrnjkeuri.tg5.dozzie@jarowit.net> <pan.2012.02.24.12.15.32@dracorp.one.pl> <slrnjkf016.tg5.dozzie@jarowit.net>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: piecia aka dracorp <imie.nazwisko@wp.eu> Newsgroups: pl.comp.lang.perl Subject: Re: Odpowiednik funkcji source z basha Date: Fri, 24 Feb 2012 14:40:39 +0000 (UTC) Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 89 Message-ID: <pan.2012.02.24.14.45.53@dracorp.one.pl> References: <pan.2012.02.24.11.56.04@dracorp.one.pl> <slrnjkeuri.tg5.dozzie@jarowit.net> <pan.2012.02.24.12.15.32@dracorp.one.pl> <slrnjkf016.tg5.dozzie@jarowit.net> NNTP-Posting-Host: 62.108.180.232 Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1330094439 13737 62.108.180.232 (24 Feb 2012 14:40:39 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Fri, 24 Feb 2012 14:40:39 +0000 (UTC) X-User: dracorp User-Agent: Pan/0.135 (Tomorrow I'll Wake Up and Scald Myself with Tea; GIT 30dc37b master) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit