In 变量§

查看主要文档 在上下文中 了解my 声明符

使用 my 声明变量会赋予其词法作用域。这意味着它仅在当前块中存在。例如

{
    my $foo = "bar";
    say $foo# OUTPUT: «"bar"␤» 
}
say $foo# Exception! "Variable '$foo' is not declared" 

这会引发错误,因为 $foo 仅在我们处于相同作用域时才会被定义。

为了在同一语句中创建多个具有词法作用域的变量,请用括号括住这些变量

my ( $foo$bar );

另请参阅 声明具有词法或包作用域的变量列表

此外,词法作用域意味着变量可以在新作用域中暂时重新定义

my $location = "outside";
 
sub outer-location {
    # Not redefined: 
    say $location;
}
 
outer-location# OUTPUT: «outside␤» 
 
sub in-building {
    my $location = "inside";
    say $location;
}
 
in-building;    # OUTPUT: «inside␤» 
 
outer-location# OUTPUT: «outside␤»

如果已重新定义变量,则引用外部变量的任何代码将继续引用外部变量。因此,此处 &outer-location 仍会打印外部 $location

sub new-location {
    my $location = "nowhere";
    outer-location;
}
 
new-location# OUTPUT: «outside␤» 

要使 new-location() 打印 nowhere,请使用 the * twigil$location 设为动态变量。在尝试本地作用域后,此 twigil 会在调用作用域中查找符号,而不是在外部作用域中查找符号。

my 是子例程的默认作用域,因此 my sub x() {}sub x() {} 执行完全相同的操作。