gpt4 book ai didi

perl - 在Perl中,范围和功能之间的区别

转载 作者:行者123 更新时间:2023-12-04 13:51:30 25 4
gpt4 key购买 nike

伙计们,我有点困惑,当我遇到这个问题时,我正在Perl中进行作用域定义:

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

sub nested {
our $x = "nested!";
}

print $x; # Error "Variable "$x" is not imported at nested line 10."
print our $x; # Doesn't print "nested!"
print our($x) # Doesn't print "nested!"

但是当我这样做时:
{
our $x = "nested";
}

print our($x); # Prints "nested"
print our $x; # Prints "nested"
print $x; # Prints "nested"

你们可以向我解释为什么这些方法行不通吗?

最佳答案

  • 要说明块示例为何按其方式工作,让我们看一下"Modern Perl" book, chapter 5中的our说明

    Our Scope

    Within given scope, declare an alias to a package variable with the our builtin.
    The fully-qualified name is available everywhere, but the lexical alias is visible only within its scope.



    这就解释了为什么第二个示例的前两张图片有效(我们在print的范围内重新声明了),而第三张却不起作用(因为我们唯一的别名$ x是该块范围内的package变量)。请注意,打印$main::x 将使正常工作-只是范围内的别名,而不是包变量本身。

  • 就功能而言:
  • print our $x;print our($x)“不起作用”-即正确声明该值未初始化-因为您从未调用过用于初始化变量的函数。观察差异:
    c:\>perl -e "use strict; use warnings; sub x { our $x = 1;} print our $x"
    Use of uninitialized value $x in print at -e line 1.

    c:\>perl -e "use strict; use warnings; sub x { our $x = 1;} x(); print our $x"
    1
  • print $x;的工作原理与该块不一样-our仅将别名的作用域限定在该块(即子实体的这种情况下),因此您必须在主块的作用域中对它进行别名(按照print our $x的规定)例如),或者在子外部使用完全合格的程序包全局,在这种情况下,它将按预期方式运行:
    c:\>perl -e "use strict; use warnings;  sub x { our $x = 1;}  print  $main::x"
    Use of uninitialized value $x in print at -e line 1.

    c:\>perl -e "sub x { our $x = 1;} x(); print $main::x"
    1
  • 关于perl - 在Perl中,范围和功能之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17078314/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com