2010-06-04 6 views
4

Comment puis-je transférer la valeur de la variable de sous-programme dans une autre variable de sous-programme, Puis-je utiliser une variable globale. J'ai essayé d'utiliser package et la variable globale, mais a échoué.Variable globale, variable de sous-programme Question en Perl

sub foo(){ 

my $myvar = "Hello"; 
} 

sub foo1(){ 
my $myvar1 = $myvar; # how can I get the "Hello" from $myvar. 
} 

Package Bar; 
our $bar; 

Merci.

+2

Cela sent comme un problème X/Y. Si vous posez des questions sur votre problème actuel (X) au lieu de savoir comment vous pensez le résoudre (Y), vous obtiendrez de meilleures réponses. –

+2

Le paquet est orthographié 'package' pas' Package'. Comme il est maintenant, perl le voit comme 'Bar-> Package();' (appelant la méthode 'Package' du paquet' Bar') –

Répondre

13

Vous pouvez déclarer la variable dans un champ qui comprend les 2 fonctions:

{ my $myvar 

    sub foo{ 
    $myvar = "Hello"; 
    } 

    sub foo1{ 
    my $myvar1 = $myvar; 
    } 
} 

Ce n'est pas vraiment élégant cependant, et peut être difficile à maintenir, car il ne sait pas dans foo1 où la valeur de $myvar a été défini. Il est probablement préférable de passer la variable en argument.

sub foo { 
    my $myvar = "Hello"; 
    return $myvar; 
} 

sub foo1 { 
    my($myvar)= @_; 
    my $myvar1 = $myvar; 
} 

# calling code 
my $myvar= foo(); 
foo1($myvar); 

Notez que tous les 3 $myvar sont des variables différentes, dans des portées différentes.

Comme une note de côté, en utilisant des prototypes (sub foo()) est probablement pas une bonne idée, sauf si vous savez vraiment ce qu'ils font, ce qui risque de ne pas être le cas (voir The problem with prototypes pour une discussion sur des prototypes)

2

Vous avez quelques approches.

Le plus simple est de ne pas déclarer la variable avec my. Mais cela vous oblige à éviter use strict; et n'est pas recommandé en conséquence.

Vous pouvez déclarer votre variable en dehors de les fonctions en haut de votre script. Cette variable serait alors disponible pour toutes les fonctions ci-dessous. Ceci est une conséquence de scope: les variables déclarées en dehors d'un ensemble d'accolades sont généralement disponibles à l'intérieur des accolades suivantes.

Vous pouvez déclarer votre variable à l'aide du pragma use vars qw/$myvar/;. Cela rend intrinsèquement votre variable disponible dans le code suivant.

4

Il suffit de ne pas utiliser my:

#!/usr/bin/perl 

sub foo() { 
    $myvar = "Hello\n"; 
} 

sub foo1() { 
    $myvar1 = $myvar; 
    print $myvar1; 
} 

print "here we go!\n"; 
foo(); 
foo1(); 

Cependant, je ne recommande pas cette façon de programmation.

+2

Je suis un peu mécontent de la downvotation appliquée à cette question. Un commentaire suffit à souligner que la pratique pourrait avoir des conséquences. Cependant, l'un des mots clés sur Perl est "il y a plus d'une façon de le faire" (TIMTOWTDI). Se battre les uns les autres et dire qu'il n'y a qu'une seule vraie façon de faire est préjudiciable à la communauté Perl. L'auteur de cette réponse l'a fait de bonne foi et peut-être que, au lieu de réduire ce poste, les gens auraient pu remplacer les bons posts. Downvoting est le meilleur pour les réponses hors sujet ou délibérément inflammatoire dont ce poste n'était ni l'un ni l'autre. –

+0

Pourriez-vous m'expliquer pourquoi vous rejetez ma réponse ci-dessus? Est-ce à cause de mon commentaire sur "cette façon de programmer"? – MarcoS

+2

Le problème principal que je vois avec ceci (que personne n'a choisi de mentionner, sentant simplement que downvoting la réponse ou ajouter un getout cryptique sans justification suffira) est qu'il emploie des variables globales implicites. Ceci est désapprouvé (n'importe quel nom global peut être utilisé, qu'il soit déclaré => pas de détection à la compilation des erreurs d'orthographe variable, pas de portée des variables => bugs subtler) et c'est une des raisons pour lesquelles utiliser strict/warnings est tel une bonne idée. – ijw

5

Comment puis-je transférer la valeur de la variable de sous-programme dans une autre variable de sous-programme? Puis-je utiliser des variables globales?

Oui, vous pouvez:

my $myvar; 
sub foo(){ 
    $myvar = "Hello"; 
} 

sub foo1(){ 
    my $myvar1 = $myvar; # how can I get the "Hello" from $myvar. 
} 

Cela fonctionne même avec "use strict;" et "utiliser des avertissements". J'ai essayé d'utiliser le package et la variable globale, mais j'ai échoué.

Les variables de package sont pour les variables que vous souhaitez exporter en dehors de votre package, pas pour les variables que vous souhaitez partager entre deux sous-routines dans le même package.

0

Le code suivant peut démontrer une solution à ce que vous décrivez:

#!/usr/bin/perl 
use strict; 
my $var = "hello"; 
sub foo { 
    local *var; 
    print "$var world\n"; 
    $var = "hi"; 
} 

sub bar { 
    local *var; 
    print "$var world\n"; 
    $var = "hey"; 
} 

foo(); 
bar(); 
print "$var world\n"; 

Le résultat devrait être:

hello world 
hi world 
hey world