Schrift
[thread]12200[/thread]

Hash an Perlskript übergeben



<< >> 7 Einträge, 1 Seite
mtbf
 2008-07-17 19:15
#112267 #112267
User since
2008-07-17
3 Artikel
BenutzerIn
[default_avatar]
Hi,

ich rufe aus einem perl Skript ein zeites perl skript auf und möchte diesem Parameter (incl. einem Hash) übergeben.

Bsp.:
Skript 1

Perlcode
skript2 hash par2 par3
Perlcode

Skript2
Code (perl): (dl )
1
2
3
4
5
%tmp = shift;

foreach (keys %$tmp) {
        print "$tmp{$_}\n";
}


kann mir jemand erklären warum es nicht funktioniert ???

Gruß Ralf
moritz
 2008-07-17 19:32
#112270 #112270
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
%tmp = shift; kann gar nicht funktionieren, weil shift nur einen einzigen Wert liefert, ein Hash aber eine gerade Anzahl von Werten enthält.

Wie rufst du denn das zweite Perl-Script auf?
mtbf
 2008-07-17 19:38
#112271 #112271
User since
2008-07-17
3 Artikel
BenutzerIn
[default_avatar]
system("perl skript2.pl hash par2 par3");
moritz
 2008-07-17 19:45
#112273 #112273
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
mtbf+2008-07-17 17:38:47--
system("perl skript2.pl hash par2 par3");


Das kann so nicht funktionieren, weil der Hash ja erst mal für die Kommandozeile in einen String umgewandelt wird, und nicht automagisch zurückverwandelt werden kann.

Normalerweise löst man dieses Problem, indem man keine externen Scripte aufruft, sondern Module einbindet, und dann eine Funktion aus dem eingebundenen Modul aufruft.
mtbf
 2008-07-17 20:17
#112275 #112275
User since
2008-07-17
3 Artikel
BenutzerIn
[default_avatar]
Skript2 sieht so aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
use Data::Dumper;

@tmp = shift;

print Dumper @tmp;

foreach my $p (@tmp) {
        foreach (keys %{$p}) {
                print "$p->{$_}\n";
        }
}


Dump gibt mir folgendes aus:
$VAR1 = 'HASH(0x2021fc4)';

ich bekommen diesen blöden Hash einfach nicht dereferenziert!!
Linuxer
 2008-07-17 20:26
#112276 #112276
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Hi,

das wirst Du so auch nicht hinbekommen. Denn innerhalb Deines System-aufrufs wird an Stelle des Hashs ein String gepackt, an dem der Datentyp und die Speicheradresse erkannt werden kann.

Du kannst in Deinem zweiten Skript keine Variable des ersten Skriptes direkt ansprechen.
Entweder serialisierst Du den Hash (und wandelst dann im zweiten Skript den String wieder in einen Hash) oder Du verwendest ein Modul, wie es moritz bereits vorgeschlagen hat.
Der 2. Weg ist der bessere, IMHO.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Struppi
 2008-07-18 02:53
#112288 #112288
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Zeig doch mal ein Beispiel das läuft, dann kann man dir zeigen was du falsch machst. Mit solchen Fragmenten kann keiner was anfangen
<< >> 7 Einträge, 1 Seite



View all threads created 2008-07-17 19:15.