【问题标题】:Perl subroutine local global issuePerl 子程序本地全局问题
【发布时间】:2016-05-19 14:03:10
【问题描述】:

对于这个小代码,它总是在全局代码块中打印@x 的值。如果我不小心没有在没有“my @x”的子例程中初始化变量,如何发出警告。我不想将子例程中的局部变量用作@x。

use strict;
use warnings;
my @x=qw/1 2 3/;

&mysub();

sub mysub{

    print "@x";
}

【问题讨论】:

  • 我不同意近距离投票。这并不清楚。恐怕这是不可能的。
  • Perl6 可以做到。 This 看起来很整洁。
  • 请不要使用&调用子程序。从来没有必要。

标签: perl scope subroutine


【解决方案1】:

使用常规 Perl 你不能做到这一点。解决方案是不要在较小的范围内重复使用相同的变量名


如果您想以编程方式强制执行此操作,可以使用Perl::Critic。政策Perl::Critic::Policy::Variables::ProhibitReusedNames 会告诉您是否重用了已在外部作用域中定义的变量名称。

【讨论】:

  • 我同意,但是非常常见的变量名称,如 $t、$n、$count 等可能会意外地出现。有什么方法或模块可以检查吗?
  • 不要使用单字母变量名。养成使用尽可能窄范围的习惯。 (例如,仅在可能的情况下才使用当前代码块)。
  • 很高兴你称 Perl5 为“常规”,因此 Perl6 隐含地为“不规则”。我敢肯定这不是你的意图,但无论如何我同意。 :-)
  • @PerlDog 他们是不同的语言。当我写下答案时,我确信有某种方法可以使用 XS 来做到这一点,并且可能有一些模块(或者更可能它在核心中)可以进行自省,直到它可以告诉你你的范围。但我不确定。由于我们试图在这里现场,我添加了一个免责声明。这就是为什么我说regular Perl,而不是黑暗的奥术魔法。后来我在研究那个奥术魔法时添加了关于 Perl6 的评论。找到那个之后,我还是放弃了。不过我明白你的意思。 Perl6 可能很奇怪,但很有趣 :)
【解决方案2】:
  1. 更好地组织您的代码。

    use strict;
    use warnings;
    
    sub mysub{
        print "@x";
    }
    
    {
        my @x=qw/1 2 3/;
        mysub();
    }
    

    通过正确本地化变量,不会发生意外引用错误的变化。

  2. 不要使用这种无意义的变量名。

    偶然访问@frobs_by_name的可能性很小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多