Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl中词法范围和动态范围的区别是什么?_Perl_Scope - Fatal编程技术网

Perl中词法范围和动态范围的区别是什么?

Perl中词法范围和动态范围的区别是什么?,perl,scope,Perl,Scope,据我所知,my运算符用于声明真正在词汇范围内的变量,而动态作用域是使用local运算符来声明变量的 有人能简单地描述一下吗 局部($x)保存全局变量$x的旧值,并 为正在运行的子例程的持续时间指定一个新值 在从该子例程调用的其他函数中可见。这已经完成了 在运行时,称为动态作用域。local()始终影响 全局变量,也称为包变量或动态变量 my($x)创建一个新变量,该变量仅在当前视图中可见 子程序。这是在编译时完成的,因此称为词法或 静态作用域。my()始终影响私有变量,也称为 词法变量或(不正确

据我所知,
my
运算符用于声明真正在词汇范围内的变量,而动态作用域是使用
local
运算符来声明变量的

有人能简单地描述一下吗

局部($x)保存全局变量$x的旧值,并 为正在运行的子例程的持续时间指定一个新值 在从该子例程调用的其他函数中可见。这已经完成了 在运行时,称为动态作用域。local()始终影响 全局变量,也称为包变量或动态变量

my($x)创建一个新变量,该变量仅在当前视图中可见 子程序。这是在编译时完成的,因此称为词法或 静态作用域。my()始终影响私有变量,也称为 词法变量或(不正确)静态(范围不正确)变量

请看:

my
创建局部变量<代码>本地没有


我将添加一个快速示例

$var = "Global";

sub inner {
    print "inner:         $var\n";
}

sub changelocal {
    my $var = "Local";
    print "changelocal:   $var\n";

    &inner
}

sub changedynamic {
    local $var = "Dynamic";
    print "changedynamic: $var\n";

    &inner
}

&inner
&changelocal
&changedynamic
这将提供以下输出(添加注释)


可以将动态变量看作是为调用的函数屏蔽全局变量的一种方法。其中,作为词法范围的变量只能从最近大括号内的代码中看到。

“my($x)创建了一个新变量,该变量只能在当前子例程中看到”。事实并非如此<代码>我的创建仅在当前代码块中可见的新变量。子例程只是块的一个示例。您在定义
local
@O.D时也犯了类似的错误:如果
{}
周围没有花括号,那么
我的
范围就是整个文件。其中任何一个都是Perl的当前代码块。
inner:         Global  # Finds the global variable.
changedynamic: Dynamic # Dynamic variable overrides global.
inner:         Dynamic # Find dynamic variable now.
changelocal:   Local   # Local variable overrides global.
inner:         Global  # The local variable is not in scope so global is found.