2013-06-17 4 views
-1

Mon attente: Je dois utiliser la commande suivante pour envoyer la valeur du premier argument à tous les fichiers appelant le fichier perl.pl.Programmation Perl dans Shell

./perl.pl 1 

L'un est lu en utilisant le fichier suivant: (perl.pl)

#!/usr/bin/perl 
package Black; 
use strict; 
use warnings; 

#subroutines 
sub get_x(); 

#variables 
our $XE = -1; 

    my ($param1, $param2, $param3) = @ARGV; 
    my $x = get_x(); 

    sub get_x() 
    { 
    $XE = $param1; 
    return $XE; 

    } 

exit; 

Puis j'ai écrit un autre script qui exécute une base de code sur l'entrée perl.pl (0 ou 1) . Le fichier est ./per.pl et j'invoquer à partir de terminal Linux comme ceci: ./per.pl Voici le code que j'ai écrit pour lui:

#!/usr/bin/perl 

require "perl.pl"; 

my $xd = Black::get_x(); 
if ($xd ==1){ 
print $xd;} 
else { 
print "5"; 
} 

sortie;

Mais ce que je reçois quand j'écris ces commandes:

./perl.pl 1 

j'ai essayé de l'imprimer et imprime 1 ... retiré l'impression comme à partir du code dans ce cas

./per.pl 

Et maintenant je n'ai rien. Je voudrais que le 1 s'imprimé mais pas elle ne présente pas

Merci à l'avance

+0

Vous n'avez rien? Black :: get_x() renvoie toujours undef quand il est invoqué par 'per.pl', donc le test échoue toujours, donc il imprime toujours 5. Peut-être que vous ne voyez pas la sortie parce que vous n'imprimez pas de retour à la ligne. essayez './per.pl; echo' à la coque. –

Répondre

5

Avant de commencer, vous ne pouvez pas peut-être obtenir la sortie que vous dites que vous obtenez parce que vous dites que le processus exit lorsque le module est exécuté par require, donc Black::get_x() n'est jamais atteint. Remplacez exit; par 1;.


Maintenant à votre question. Si je comprends bien, vous voulez passer une valeur à un processus via sa ligne de commande, et récupérer cette valeur en exécutant le même script sans le paramètre.

Vous n'avez même pas essayé de passer la variable d'un processus à un autre, il ne devrait donc pas être surprenant que cela ne fonctionne pas. Comme les deux processus n'existent même pas en même temps, vous devez stocker la valeur quelque part, comme le système de fichiers.

#!/usr/bin/perl 

use strict; 
use warnings; 

my $conf_file = "$ENV{HOME}/.black"; 
my $default = -1; 

sub store { 
    my ($val) = @_; 
    open(my $fh, '>', $conf_file) or die $!; 
    print $fh "$val\n"; 
    return $val; 
} 

sub retrieve { 
    open(my $fh, '<', $conf_file) 
     or do { 
      return $default if $!{ENOENT}; 
      die $!; 
     }; 

    my $val = <$fh>; 
    chomp($val); 
    return $val; 
} 

my $xd = @ARGV ? store($ARGV[0]) : retrieve(); 
print("$xd\n"); 
+0

J'ai d'abord mal compris la question. Mise à jour ma réponse – ikegami

+0

Bonjour, j'apprécie vraiment votre réponse. Pouvez-vous s'il vous plaît expliquer un peu aussi. Comme ce que font les commandes. Merci – ban

+0

pouvez-vous expliquer mon $ conf_file = "$ ENV {HOME} /. Black"; et mon ($ val) = @_; et return $ default si $! {NOENT}; Je pense que je comprends le reste que vous écrivez dans un fichier, puis vous lisez. – ban

Questions connexes