【问题标题】:Global Variable, subroutine variable Question in PerlPerl中的全局变量、子程序变量问题
【发布时间】:2010-06-04 07:48:12
【问题描述】:

如何将子程序变量值转移到另一个子程序变量中,我可以使用全局变量吗?

sub foo(){

my $myvar = "Hello";
} 

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

我尝试使用包和全局变量,但失败了。

Package Bar;
our $bar;

谢谢。

【问题讨论】:

  • 这听起来像是 X/Y 问题。如果你问的是你的实际问题 (X) 而不是你认为如何解决它 (Y),你会得到更好的答案。
  • 包拼写为package 而不是Package。就像现在一样,perl 将其视为Bar->Package();(调用包Bar 的方法Package

标签: perl global-variables subroutine


【解决方案1】:

您可以在包含 2 个函数的范围内声明变量:

{ my $myvar

  sub foo{
    $myvar = "Hello";
  } 

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

这不是很优雅,而且很难维护,因为在foo1 中并不清楚$myvar 的值是在哪里设置的。将变量作为参数传递可能会更好。

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

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

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

请注意,所有 3 个$myvar 都是不同的变量,在不同的范围内。

作为旁注,使用原型 (sub foo()) 可能不是一个好主意,除非您真的知道他们在做什么,但情况可能并非如此(有关原型的讨论,请参阅 The problem with prototypes

【讨论】:

    【解决方案2】:

    如何将子程序变量值转移到另一个子程序变量中,可以使用全局变量吗?

    是的,您可以:

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

    这甚至适用于“use strict;”和“使用警告;”。

    我尝试使用包和全局变量,但失败了。

    包变量用于您要在包外导出的变量,而不是您希望在同一包中的两个子例程之间共享的变量。

    【讨论】:

      【解决方案3】:

      只是不要使用my

      #!/usr/bin/perl
      
      sub foo() {
        $myvar = "Hello\n";
      }
      
      sub foo1() {
        $myvar1 = $myvar;
          print $myvar1;
      }
      
      print "here we go!\n";
      foo();
      foo1();
      

      但是,我不推荐这种编程方式。

      【讨论】:

      • 我对这个问题的反对票有点不满意。评论足以指出这种做法可能会产生后果。然而,关于 Perl 的关键说法之一是“有不止一种方法可以做到这一点”(TIMTOWTDI)。互相攻击并说只有一种真正的方法可以做到这一点,这对 Perl 社区是有害的。此回复的作者是出于善意这样做的,也许人们本可以对好帖子投赞成票,而不是对这篇文章投反对票。投反对票最适合偏离主题的答案或故意煽动这篇帖子。
      • 你能解释一下为什么你在上面对我的回答投反对票吗?是因为我对“这种编程方式”的评论吗?
      • 我看到的主要问题是它使用了隐式全局变量(没有人选择提及,只是觉得降低答案或添加没有理由的神秘 getout 就足够了)。这是不受欢迎的(任何全局名称都可以使用,无论它是否已声明=>没有变量拼写错误的编译时检测,没有变量范围=>更微妙的错误)并且是使用严格/警告的原因之一好主意。
      • 我没有否决它,但我会考虑它,因为它提倡糟糕的编程实践,而没有足够的警告或解释它为什么不好。如果有人问如何检查他们正在烘烤的砂锅的温度,一个好的答案是使用食物温度计。告诉这个人把手指塞进砂锅的中间,看看它是否感觉很热,这是一个不好的答案。是的,它可能会告诉您天气是否热,但您可能会烫伤自己,将手指伸入食物中,弄得一团糟等。即使有效,这也是一个糟糕的解决方案。
      【解决方案4】:

      你有几种方法。

      最简单的就是不要用my声明变量。但这需要您避免使用use strict;,因此不推荐使用。

      您可以在脚本顶部的函数外部声明变量。然后,该变量将可用于下面的所有函数。这是scope 的结果:在一组花括号外声明的变量通常在任何后续花括号内都可用。

      您可以使用use vars qw/$myvar/; pragma 声明您的变量。这本质上使您的变量在以下代码中可用。

      【讨论】:

        【解决方案5】:

        以下代码可能演示了您所描述的解决方案:

        #!/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";
        

        结果应该是:

        hello world
        hi world
        hey world
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-06
          • 1970-01-01
          • 2022-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多