【问题标题】:relevance of declaring variable in perl在 perl 中声明变量的相关性
【发布时间】:2011-07-18 20:31:44
【问题描述】:

在Perl编程中,变量声明有什么关系,什么时候可以改变它所包含的值?

例如

my $name ="johny";

在下一个语句中,我们可以更改它包含的值的类型:

$name = 10;

那么声明变量的意义是什么,当变量的类型不固定时,Perl是如何分配内存的呢?

【问题讨论】:

  • 这不会改变值的类型。
  • 取决于你所说的类型。
  • my $name = "johny" 声明一个“标量”类型的变量并为其分配一个标量值。 $name=10 还将一个标量值分配给一个标量变量。
  • @friedo:不,取决于您所说的价值。 :)

标签: perl


【解决方案1】:

声明变量有几个原因。

  • 声明变量的范围。

    {
      my $salutations = "hello\n";
    }
    print $salutations; # undef
    
  • 在与use strict; 一起使用时捕获拼写错误。

    use strict;
    my $salutations = "hello\n";
    print $_salutations;
    # Global symbol "$_salutations" requires explicit package name ...
    

    这就是为什么建议将use strict; 放在程序开头的原因。

  • 在新块中重用变量名,而不影响封闭块。

    my $salutations = "hello\n";
    {
      my $salutations = "hi there\n";
      print $salutations;
      # prints: hi there
    }
    print $salutations;
    # prints: hello
    

【讨论】:

  • 这不会临时将变量的值设置为其他值。不过,local 会这样做。
  • @tchrist,Brad 的代码用于临时设置词法变量的值。虽然如果您使用包变量并且希望更改在动态范围内可见,local 是一种方式。
  • @dsolimano:不,它不是临时设置词法变量的值。它完全是一个不同的变量,始终具有相同的值。
  • 第三个例子还是用词错误。考虑例如{ my $saluations = $salutations . "buddy"; ⋯ },这证明它们是完全独立的变量。获取他们的地址也是如此,因为\$saluations 在块内给出的数字与在块外给出的数字不同,即使它们的值相同。请不要将变量与值混淆。该块创建了一个全新的变量,该变量恰好与封闭词法范围中的变量具有相同的名称。
【解决方案2】:

你说得对,变量声明不需要像 C 中那样区分整数/浮点数/...类型。

我认为 perl 变量声明不是内存分配指令,更多的是指定 $name 何时有效的命名空间指令。解释器将根据需要分配/释放内存。在 $name 中构建一个非常长的字符串会导致为其分配更多内存。

用“my $var”声明一个变量使其成为当前范围的本地变量。没有“my”声明,它是一个全局变量。通常子程序应该用“my”声明它们使用的任何变量,以避免污染全局命名空间。有关更多背景信息,请阅读 perlsub 文档。

here 所述,声明变量的位置可能会影响性能,因为它可能会导致变量被销毁/重新创建。

【讨论】:

    【解决方案3】:

    使用特殊变量和无缘无故的自动复活导致对黑魔法的依赖。此外,它会影响变量的作用域,从而使跟踪程序流程变得更加困难,因此维护和调试也更加困难。

    对于您问题的另一部分,Perl 数据类型是标量、数组和散列。与低级语言或其他一些更强类型的语言不同,原始数据类型并没有真正发挥作用。至于它是如何在编译器/解释器内部实际处理的,我不是 100% 确定,但这里可能是一个好的起点:http://dev.perl.org/perl5/docs/perlhack.html

    【讨论】:

    • Autoviv 与变量声明或缺少变量声明无关。
    • @tchrist 我见过没有预先声明散列的代码,并且元素在基于魔术变量的循环中自动激活。我知道滥用 autoviv 意味着在没有预先声明的情况下凭空抽出一个 var,但我对黑魔法的评论仍然有效。
    • 这只是 FUD。没有“神奇地出现”的东西与是否声明散列有关。也没有任何与“魔法变量”有关的东西,无论这意味着什么。 -①
    • 如果您向我们展示您所指的代码,那么我们可以向您解释。如果你不这样做,那么我们就不能。
    • @tadmc,我不需要帮助来理解它,我只是在第一次进入项目时并没有真正欣赏它,不得不扭曲我的大脑,使其脱离它的 C 风格的 declare-before - 使用心态。
    【解决方案4】:

    声明变量的优点之一是有助于减少错误,尤其是与以下各项结合使用时:

    use strict;
    use warnings;
    

    在这种情况下,如果你输入错误的变量名,Perl 会告诉你你引用了一个未声明的变量:

    my $name = 'johnny';
    print $nane;
    

    【讨论】:

    • 是的,但从调试的角度来看这很有用。如何为变量完成内存分配
    • 我帮不了你。 :)
    • 内存分配是动态完成的,在需要时分配,在不再需要时释放。
    • @prp:如果你想知道变量内部到底发生了什么,那么你应该研究 perlguts 中的 SV:perldoc.perl.org/perlguts.html#Working-with-SVs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2013-07-11
    • 1970-01-01
    相关资源
    最近更新 更多