Thread ksh in perl umschreiben? (5 answers)
Opened by schuetze09 at 2009-08-19 14:41

topeg
 2009-08-19 19:21
#124458 #124458
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
In dem Script sind zwei Varianten:

Einmal das schnelle Auslesen mittels shell,
das andere ist das Parsen direkt aus der Datei


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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/perl

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

my $ini='test.sh';

print Dumper({exe_ini($ini)});
print "#"x80,"\n";
print Dumper({parse_ini($ini)});




# der sicherste Weg:
# hier lese ich erst die Datei ein,
# um sie Schlüssel zu bekommen.
# Danach führe ich die Datei in der Shell aus
# und lese dann die vorher geparsten
# und nun gesetzten variablen aus.
# Ich lese alle Variablen auf einmal aus,
# das get recht schnell,
# da der Shellinterpreter nur einmal ausgeführt werden muss.
sub exe_ini
{
  my $file=shift;
  my %keys;

  # alle Schlüssel aus der Datei
  open(my $fh, '<', $file) or die "Error open $file ($!)\n";
  while(my $line=<$fh>)
  {
    # Ein Schlüssel ist ein wort,
    # vor dem nur leerzeichen sind
    # und auf dem ein "=",
    # mit möglichen leerzeichen dazwischen,
    # folgt
    $keys{$1}++ if($line=~/^\s*(\w+)\s*=/);
  }
  close ($fh);

  # liste aller Schlüssel
  my @list=keys(%keys);
  # shellkomando zusammenbauen
  my $cmd='';
  # für jeden Schlüssel ein echo
  $cmd.="echo \\\$$_; " for(@list);
  #alles ausführen
  my @vals=qx{sh -c ". $file; $cmd"};
  # Zeilenumbrüche weg
  chomp(@vals);
  # Schlüssel und Werte zusammenführen
  @keys{@list}=@vals;

  return %keys
}

# parsen von "Hand"
# Zeile für Zeile einlesen,
# schlüssel=wert paare suchen.
# Schauen ob der wert ein schlüsselaufruf ist,
# wenn dann neuen Wert ermitteln.
sub parse_ini
{
  my $file=shift;
  my %keys;
  open(my $fh, '<', $file) or die "Error open $file ($!)\n";
  while(my $line = <$fh>)
  {
    # wir lesen das Schlüssel-Wert-Paar
    if($line =~/^\s*(\w+)="([^"]*)"/ ||
       $line=~/^\s*(\w+)=(.*?)(?:;|$)/)
    {
      my $key=$1;
      my $val=$2;
      $val=~s/\$\{([^\}]+)\}/$keys{$1}/g;
      $val=~s/\$(\w+)/$keys{$1}/g;
      $keys{$key}=$val;
    }
  }
  close($fh);
  return %keys;
}

View full thread ksh in perl umschreiben?