Schrift
[thread]12630[/thread]

ksh-Befehl in perl?



<< >> 6 Einträge, 1 Seite
schuetze09
 2008-10-13 11:11
#115445 #115445
User since
2006-07-24
15 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

vielleicht kann mir jemand weiterhelfen.
Ich lese ein ini-File ein verwende folgende Befehl, um auch Values "aufzulösen:

$value = qx{ ksh -c '. $auto_ini_file ; echo "\$$var" ' }

wie kann ich diese Zeile in perl umschreiben, um auf diesen ksh-Befehl zu verzichten?

im ini-File steht folgendes:

VERTEILER='mustermann@muster.de'
EMAILS=$VERTEILER

aufgelöst sollte sich dann folgendes ergeben:
VERTEILER='mustermann@muster.de'
EMAILS='mustermann@muster.de'


MfG
renee
 2008-10-13 11:29
#115446 #115446
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
$ENV{VERTEILER} = 'mustermann@muster.example';
$ENV{EMAILS} = $ENV{VERTEILER};
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
schuetze09
 2008-10-13 11:34
#115447 #115447
User since
2006-07-24
15 Artikel
BenutzerIn
[default_avatar]
ja, schon klar. Ich habe nur das Problem, dass diese Format schon "etabliert" ist und ich es nicht einfach ändern kann. Den ksh-Befehl wollte ich aus dem Tool gerne rausschmeißen, damit ich etwas Betreibssystem-unabhängiger werde.

momentan lese ich das ini-File so ein:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                open(CONFIG, $file) or die print "\n\nFEHLER: ini-File ($file) nicht gefunden ($!)\n";

                        while (<CONFIG>)
                        {
                                chomp;          # kein NewLine
                                s/#.*//;        # keine Kommentare
                                s/^\s+//;       # keine fuehrenden White-Spaces
                                s/\s+$//;       # keine angehaengten White-Spaces
                                next unless length;     # noch was da?
                                my ($var, $value) = split(/\s*=\s*/, $_, 2);
                                $value = qx{ ksh -c '. $auto_ini_file ; echo "\$$var" ' } ;     
                                chomp $value;

                                $AUTO_ENV_DATA{$var}="$value";
                        
                        }
                close(CONFIG);
Ronnie
 2008-10-13 12:01
#115449 #115449
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Tipp: Evtl. mal im CPAN schauen was die dortigen Module zum .ini-Dateien parsen können.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;
use Carp;

my %config;

while(my $line = <DATA>) {
chomp($line);
my ($k, $v) = ($line =~ m/^\s*(\w+)\s*=\s*(.*)\s*$/);
if (defined $k and defined $v) {
$v =~ s/['"]//g;
if ($v =~ m/^\$(.*)/) {
$v = $config{$1};
}

$config{$k} = $v;
}
}

carp Dumper \%config;

__DATA__
VERTEILER='mustermann@muster.de'
EMAILS=$VERTEILER
schuetze09
 2008-10-13 12:07
#115450 #115450
User since
2006-07-24
15 Artikel
BenutzerIn
[default_avatar]
besten Dank, damit geht es :-)
topeg
 2008-10-13 14:17
#115452 #115452
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Eine Variante, die sich ein wenig mehr wie eine Ksh verhält.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;


my @ini=<DATA>;
print Dumper(parse(@ini));


sub parse
{
  my @ini=@_;
  my %ret;
  for my $data (@ini)
  {
    $data=~s/#.+$//;
    $ret{$1}=$2 if($data=~/^\s*(.+?)\s*=\s*(.+?)\s*$/);
  }
  my $reg=join('|', keys(%ret),keys(%ENV) );
  while(my ($k,$v)=each(%ret))
  {
    if($v=~/^'/)#'
    {
      $v=~s/^'|'$//gs;
      $v=~s/\\'/'/gs;
    }
    else
    {
     if($v=~/^"/)#"
     {
       $v=~s/^"|"$//g;
     }
     $v=~s/\\\$/#DOLLAR#/g;
     $v=~s/\$($reg)/$ret{$1}? $ret{$1}: $ENV{$1}? $ENV{$1}: ''/ge;
     $v=~s/#DOLLAR#/\$/g;
     $v=~s/\\//g;
    }
    $ret{$k}=$v if($v ne $ret{$k});
  }
  return \%ret;
}

__DATA__
# ein Kommentar
TEST=Ein test # auch eingeschoben
WER=Jemmand besonderes
WAS=$TEST
TTT=$SHELL
EEE=\$SHELL
Name=Blub
Email=$Name@rabarber.test
BLA='ein Text dessen $EEE nicht beachtet wird'
BLUB="Hier wird $TTT beachtet. das das \$Name aber nicht."
<< >> 6 Einträge, 1 Seite



View all threads created 2008-10-13 11:11.