Perl 中的 my 和 local 有什么区别?

2024-04-01

我看到它们都用在我正在尝试调试的脚本中,但文献还不清楚。有人能为我揭开这个神秘面纱吗?


简短的回答是my将变量标记为词法范围内的私有变量,并且local将动态范围内的变量标记为私有。

更容易理解my,因为这会创建通常意义上的局部变量。创建了一个新变量,并且只能在封闭的词法块中访问它,该词法块通常用花括号标记。大括号规则有一些例外,例如:

foreach my $x (@foo) { print "$x\n"; }

但这只是 Perl 做你的意思。通常你会有这样的事情:

sub Foo {
   my $x = shift;

   print "$x\n";
}

在这种情况下,$x是子例程私有的,其范围由花括号括起来。需要注意的是,这是对比local, 是 a 的范围my变量是根据文件中写入的代码定义的。这是一个编译时现象。

要了解local,您需要考虑程序运行时的调用堆栈。当一个变量是local,它是从该点重新定义的local语句对堆栈上低于该语句的所有内容执行,直到将堆栈返回到包含该语句的块的调用者为止local.

一开始这可能会令人困惑,所以请考虑以下示例。

sub foo { print "$x\n"; }
sub bar { local $x; $x = 2; foo(); }

$x = 1;
foo(); # prints '1'
bar(); # prints '2' because $x was localed in bar
foo(); # prints '1' again because local from foo is no longer in effect

When foo被称为第一次,它看到了全球价值$x即 1. 当bar被称为和local $x运行,重新定义全球$x在堆栈上。现在,当foo被调用自bar,它看到新值 2$x。到目前为止,这并不是很特别,因为如果没有调用,同样的事情也会发生local。神奇的是,当bar返回我们退出创建的动态范围local $x以及之前的全球$x回到范围内。所以对于最后的呼吁foo, $x is 1.

你几乎总是想使用my,因为这为您提供了您正在寻找的局部变量。千载难逢,local做很酷的事情真的很方便。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl 中的 my 和 local 有什么区别? 的相关文章

随机推荐

  • Git 重新记录过期时间

    我知道 reflog 条目会已删除超过 90 天的内容 关于这一点 我也没有对 git config 进行任何更改 今天当我这样做的时候git reflog master date local 我可以在里面看到10个月前的条目 这怎么可能
  • jquery .html() 追加后绑定不起作用

    我有这个简单的 div div div 它是空的 现在我正在尝试附加这个HTML到上面的div div div
  • 在 hive 中创建外部表时,我可以将位置指向目录中的特定文件吗?

    我这样定义了一个表 create external table PageViews Userid string Page View string partitioned by ds string row format as delimite
  • 将 python 包从本地目录导入到解释器中

    我正在本地目录中开发 测试一个包 我想将其导入解释器 v2 5 中 但 sys path 不包括当前目录 现在我输入sys path insert 0 有没有更好的办法 Also from import mypackage 失败并出现此错误
  • C# MEF 与静态类的使用

    我的解决方案中有一个静态类 用于处理各种程序集 我想通过MEF链接它们 所以我在类中创建了一个字段 Import typeof A static private A a1 然后我有一个方法 将程序集名称作为参数传递给该方法 public s
  • Ionic App Availability 插件获取错误对象 (...) 不是函数

    我正在尝试在 ionic 中实现应用程序可用性功能 我的设备中安装了一个应用程序 并尝试检查另一个应用程序中是否存在该应用程序 但面临同样的问题 出现以下错误 您可能面临应用程序的离子版本与应用程序中安装的插件版本不匹配的问题 在 Ioni
  • Eclipse 大纲视图为空

    今天简单说一下 我的OutlineEclipse 中的视图不再显示任何方法或字段 我选择了大纲视图菜单中可用的几个选项来向我展示所有可能的内容 但仍然一无所获 如果我右键单击类编辑器并选择Quick Outline我得到了曾经出现在Outl
  • 应用程序与数据库驻留连接池

    情况 我需要在 python 中连接到 Oracle 数据库时使用连接池 多个 python 应用程序将使用我开发的辅助连接库 我的思考过程 这里我可以想到两种连接池的方式 1 让连接池由数据库本身维护和管理 由 Oracle 的 DRCP
  • 如何根据输入的行数生成html表格? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我必须使用 jquery 创建一个表 表格的行数将由输入框确定 列数是已知的 提交后 会生成一个表 尝试创建一个小提琴 我对 jque
  • 如果类型是事后定义的,则实例化具有不完整类型的类模板是否格式错误?

    这段代码肯定是格式错误的 因为Foo在实例化点之后专门化 template
  • 我应该在

    现在我们有专门的
  • Matlab - 访问多维数组的一部分

    我正在尝试访问 Matlab 中多维数组的一部分 可以这样做 X 2 3 1 20 5 4 7 然而 元素的数量和范围都不是固定的 所以我想提供数组的索引 对于上面的例子 它们是 ind1 2 1 5 4 ind2 3 20 5 7 对于固
  • C++ 使用 std::string、std::wstring 作为缓冲区

    使用 WinAPI 时 您经常会遇到一些获取 LPWSTR 或 LPSTR 作为参数的方法 有时这个指针实际上应该是指向缓冲区的指针 例如 int GetWindowTextW HWND hWnd LPWSTR lpString int n
  • Amazon S3 使 SSL 与 c# sdk 配合使用时出现问题

    我正在使用亚马逊 AWS NET SDK v1 2 1 以下代码在 DNS 查找失败后引发异常myBucket more https这显然不是它应该寻找的 AmazonS3Config S3Config new AmazonS3Config
  • Python读取时出现权限错误

    import os import rarfile file input Password List Directory rarFile input Rar File passwordList open os path dirname fil
  • 打开的连接数以及连接睡眠状态的含义

    我在我的数据库中运行了这个查询 SELECT DB NAME dbid as DBName COUNT dbid as NumberOfConnections loginame as LoginName FROM sys sysproces
  • 防止正文滚动(移动设备、本机浏览器)

    在 Samsung Galaxy S5 S6 的本机浏览器上 以下 CSS 片段 body overflow hidden 不会阻止主体滚动 有解决方法吗 编辑 如下所述 这也可以通过添加溢出 隐藏到 html 标签来完成 但这引入了窗口滚
  • 如何显示MapKit指南针?

    目前 指南针仅在以下情况下才会显示用户应用旋转手势 否则指南针将被隐藏 不过如果能实现我下面的两个愿望就好了 是否可以一直显示指南针 如何使用 Swift 显示 隐藏指南针视图 您可以在 iOS 11 中使用新功能轻松完成此操作MKComp
  • 一维字符串数组被角度资源解析为二维

    来自服务器的以下 JSON 响应 hello world 正在被 ngResource 服务解析为二维数组 myService factory Name function resource return resource site url
  • Perl 中的 my 和 local 有什么区别?

    我看到它们都用在我正在尝试调试的脚本中 但文献还不清楚 有人能为我揭开这个神秘面纱吗 简短的回答是my将变量标记为词法范围内的私有变量 并且local将动态范围内的变量标记为私有 更容易理解my 因为这会创建通常意义上的局部变量 创建了一个