2009-05-27 4 views
2

Ich habe ein Skript, das ich ausführe und nachdem es ausgeführt wurde, enthält es einige Informationen, die ich an das nächste Skript übergeben muss.Wie kann ich Argumente von einem Perl-Skript zu einem anderen übergeben?

Die Unix/DOS-Befehle sind wie folgt:

perl -x -s param_send.pl 
perl -x -s param_receive.pl

param_send.pl ist:

# Send param 

my $send_var = "This is a variable in param_send.pl...\n"; 
$ARGV[0] = $send_var; 
print "Argument: $ARGV[0]\n";

param_receive.pl ist:

# Receive param 

my $receive_var = $ARGV[0]; 
print "Parameter received: $receive_var";

Aber nichts gedruckt wird. Ich weiß, dass ich es falsch mache, aber aus den Tutorials kann ich nicht herausfinden, wie man einen Parameter von einem Skript zum nächsten übergibt!

Vielen Dank im Voraus.

+0

Jeder kopiert Ihre -x und -s Schalter, obwohl sie nichts in diesen Programmen haben. –

Antwort

0

FYI, ich bin kein Perl-Typ. Aber im Allgemeinen denke ich, dass Sie entweder eine Umgebungsvariable setzen müssen und das andere Skript von der ersten aufrufen müssen (damit es auf die Umgebungsvariable als Unterprozess der ersten zugreifen kann), oder rufen Sie das zweite Skript von der zuerst und übergeben Sie das Argument in der Befehlszeile.

Ihre ARGV-Variablen werden nur für das aktuell laufende Skript verwendet, Sie können es also nicht so verwenden, um etwas von einem zum anderen zu übertragen.

+0

Die Umgebung wird vom übergeordneten Prozess an den untergeordneten Prozess übergeben, sodass dies nicht funktioniert. Der Parent (Shell) -Prozess sieht keine Änderungen, die das Kind (Perl) an seiner Umgebung vorgenommen hat. – ijw

+0

Wie ich schon sagte, ich bin kein Perl-Typ, aber ich weiß, dass Sie das in anderen Sprachen und/oder mit OS-Funktionen tun können. – crashmstr

+0

Wenn der Code nicht im selben Prozess ausgeführt wird, werden keine Änderungen an der Umgebung angezeigt. Dies ist keine Perl-Sache, sondern eine POSIX-Sache. –

7

Sie können ein Pipe-Zeichen in der Befehlszeile verwenden stdout aus dem ersten Programm zu verbinden, die auf dem zweiten Programm stdin, die Sie dann schreiben können (mit print) oder gelesen (die <> Operator).

perl param_send.pl | perl param_receive.pl 

Wenn Sie die Ausgabe des ersten Befehls wollen die Argumente auf den zweiten Befehl sein, können Sie xargs verwenden:

perl param_send.pl | xargs perl param_receive.pl 
+0

Diese Lösung scheint genau das zu tun, was ich brauche. Vielen Dank! Ich kann Parameter vom Skript param_send an das Skript param_receive übergeben. Danke nochmal. –

2

@ARGV zur Laufzeit erstellt und bestehen nicht. Ihr zweites Skript wird also die $ARGV[0], die Sie im ersten Skript zugewiesen haben, nicht sehen können. Als crashmstr weist darauf hin, dass Sie entweder das zweite Skript von der ersten mit einem der many methods dafür ausführen müssen. Zum Beispiel:

my $send_var = "This is a variable in param_send.pl...\n"; 
`perl param_receive.pl $send_var`; 

oder eine Umgebungsvariable mit% ENV verwenden:

my $send_var = "This is a variable in param_send.pl...\n"; 
$ENV['send_var'] = $send_var; 
1

Die %ENV Hash in Perl hält die Umgebungsvariablen wie PATH, USER usw. Alle Änderungen dieser Variablen widerspiegelt 'nur' im aktuellen Prozess und jedem untergeordneten Prozess, den es hervorbringt. Der übergeordnete Prozess (der in dieser speziellen Instanz die Shell ist) spiegelt diese Änderungen nicht wider. Wenn also das Skript "param_send.pl" endet, gehen alle Änderungen verloren.

Für z.B. Wenn Sie etwas tun würden wie,

#!/usr/bin/perl 
# param_send.pl 
$ENV{'VAL'} = "Value to send to param_recv"; 


#!/usr/bin/perl 
# param_recv.pl 
print $ENV{'VAL'}; 

Dies würde nicht funktionieren, da VAL verloren ist, wenn param_send beendet. Eine Problemumgehung besteht darin, param_recv.pl von param_send aus aufzurufen.pl und den Wert als Umgebungsvariable übergeben oder ein Argument,

#!/usr/bin/perl 
# param_send.pl 
$ENV{'VAL'} = "Value to send to param_recv"; 
system("perl param_recv.pl"); 

OR 

#!/usr/bin/perl 
# param_send.pl 
system("perl param_recv.pl 'VAL'"); 

Andere Optionen Rohrleitungen die Ausgabe enthalten, oder Sie können diese PM node für eine esoterische Lösung angeboten werden.

Verwandte Themen