在Perl中,local()可以创建一个变量吗?

我在Stackoverflow和Google中读过许多帖子,告诉我 local不会创建变量,而是在现有变量上运行.

我在下面有一小段代码,我想知道当没有创建这样的变量时本地是如何工作的.

#use strict;
#use warnings;

&func;

sub func{
    local $temp = 20;
    print $temp;        
}

我写这篇文章只是为了理解这个概念而且我对Perl来说相对较新.

解决方法

除非您使用my声明变量,否则没有完整包规范的变量将进入当前包.以下是您第一次看到变量的用法以及它们的用途:
my $temp;       # a scoped,lexical variable that does not live in any package
state $temp;    # a persistent lexical variable
our $temp;      # a package variable in the current package,declared
$temp;          # a package variable in the current package
$main::temp     # a package variable in main
$Foo::Bar::temp # a package variable in Foo::Bar
local $temp     # a package variable in the current package,with a dynamically-scoped (temporary) value

local设置包变量的范围.声明此“动态”作用域时,Perl使用您设置的临时值,直到作用域结束.与其他包变量一样,Perl在您第一次使用它们时会创建它们.您可以先在本地使用它,但不会影响它.

许多试图回答你问题的人立刻唠叨你严厉.这是一个编程辅助工具,它可以帮助您通过强制声明要使用的所有变量来错误输入变量名.当您使用未声明的变量名时,它会停止编译您的程序.你可以使用vars pragma,my,state或者我们的:

use vars qw($temp);
our $temp;
my $temp;
state $temp;

正如你所见,本地不是其中的一部分.为什么?因为那就是它的样子.如果不同的话,我会更喜欢它.

如果使用完整的包规范,严格不会抱怨,例如$Foo :: Bar :: temp.你可以错误地输入所有这些,而不会注意到.

我主要保留我对Perl的特殊变量使用local,你不必声明.如果我想在子例程中使用$_,也许是为了使用默认使用$_的运算符,我可能会从本地$_开始:

sub something {
     local $_ = shift @_;
     s/.../.../;
     tr/.../.../;
     ...;
     }

我可能更频繁地使用本地输入记录分隔符,所以我可以使用不同的行结尾而不影响之前的可能:

my $data = do { local $/; <FILE> };

那些工作是因为隐含的第一次使用那些你没见过的变量.

否则,我可能希望将变量设置为其子例程的私有,因此子例程之外的任何内容都无法看到它.在这种情况下,我不希望程序的其余部分可以读取或写入的包变量.这是我变量的工作:

sub something {
    my $temp = ...;

    }

编程的诀窍是限制你想要的东西.如果您的程序的其余部分无法查看或更改变量,那么我就是您的选择.

我解释这是Learning Perl并在Mastering Perl中写了包变量的细节.

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...