Perl foreach 循环变量范围

2024-01-02

我是 Perl 新手,在编写以下代码片段后对 Perl 作用域规则感到困惑:

#!/usr/bin/perl
my $i = 0;
foreach $i(5..10){
    print $i."\n";
}
print "Outside loop i = $i\n";

我预计输出如下:

5
6
7
8
9
10
Outside loop i = 10

但它的给予:

5
6
7
8
9
10
Outside loop i = 0

因此变量 $i 的值在循环退出后不会改变。这里发生了什么事?


根据有关 foreach 循环的 perldoc 信息:here http://perldoc.perl.org/perlsyn.html#Foreach-Loops

foreach 循环迭代普通列表值并设置 变量 VAR 依次成为列表中的每个元素。如果变量 前面带有关键字 my,那么它是词法范围的,并且是 因此仅在循环内可见。否则,变量是 隐式局部于循环并在退出时恢复其先前的值 循环。如果该变量之前用 my 声明过,则它使用 该变量而不是全局变量,但它仍然本地化到 循环。这种隐式本地化仅发生在 foreach 循环中。

如果你想在循环之外保留 $i 的值,那么你可以在 foreach 循环调用中省略 $i 并使用 perl 的特殊变量 $_ ,示例如下:

#!/usr/bin/perl

use strict;
use warnings;

my $i = 0;
foreach (5..10){
    print $_."\n";
    $i = $_;
}
print "Outside loop i = $i\n";

5 6 7 8 9 10 外循环 i = 10

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

Perl foreach 循环变量范围 的相关文章

  • Bash - 在 perl 正则表达式中使用变量以及匹配组

    这是我在 stackoverflow 上的第一篇文章 如果我错过了一些重要的内容 请原谅我 我目前遇到以下问题 目标是根据我准备的文件列表动态替换端口号find 这些文件中的所有端口均以数字 4 开头 有 5 位数字 现在是棘手的部分 我只
  • 读入模板文件,使用用户输入填充并生成新文件

    我正在尝试读取如下所示的模板配置文件 template config path to speedseq package binary directory SPEEDSEQ BIN DIR usr local packages Sequenc
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 如何在调试器模式下运行 perl 测试?

    我尝试在调试器下运行测试 perl d which prove t file t 但这没有任何效果 因为每个测试都是作为单独的作业运行的 我已经发现 exec选项 但是当我提供它时 我失去了任何选项 proverc文件和命令行 prove
  • Perl 中的全局变量、子程序变量问题

    如何将子程序变量值转移到另一个子程序变量中 我可以使用全局变量吗 sub foo my myvar Hello sub foo1 my myvar1 myvar how can I get the Hello from myvar 我尝试使
  • 将相同匹配模式的连续 2 行放入单行中

    我想解析这组行 以便如果得到相同的模式 例如 lt email protected cdn cgi l email protection gt 在连续的行中 它应该以单行形式打印 并在两行之间使用 q2VDWKkY010407 222187
  • OpenSSL DH 密钥太小错误

    我正在尝试使用简单的 PERL 脚本连接到封闭的服务器 空调 usr bin perl use 5 10 1 use warnings use strict use IO Socket SSL use IO Socket SSL qw de
  • 在 FOR 循环中打印唯一值

    我有两个文件 myresult 和 annotation 两个文件中的数据似乎是范围 但事实并非如此 这就是为什么我无法将其存储在数组中 我需要使用拆分运算符 以便我可以在 for 循环中使用它并进行比较 现在我需要打印 i myresul
  • Java:直接从同一类的另一个实例访问私有字段

    我正在写一个equals Object obj 一个类的函数 我发现可以访问私有字段obj来自来电者 因此 不要使用 getter Odp other Odp obj if other getCollection contains ftw
  • 如何编写 Perl 脚本来使用 curl 处理 URL?

    我有一个非常简单的任务 我有一个 crontab 每小时运行一个脚本 该脚本旨在简单地处理 URL 这就是我所拥有的 这不起作用 我收到语法错误 usr bin perl curl http domain com page html 我已经
  • 如何将 Perl 转换为 C?

    有没有可用的工具可以将 Perl 源代码转换为 C 源代码 什么平台都可以 对此的规范答案是MJD 的 为什么不将 Perl 翻译成 C http www perl com pub a 2001 06 27 ctoperl html
  • 如何使用 Perl 分割文本文件并将其存储到二维数组中?

    230215 01 16 2000 57533 0 1045403 0 0 217623 230215 01 18 2000 77659 0 1045403 0 0 217624 230215 01 25 2000 76583 0 1045
  • Perl Parallel::Forkmanager 不允许收集变量值

    也许因为子进程不知道我的散列 请参阅下面的代码 散列 输出没有收集任何内容 除了写入 tmp 文件之外 还有其他方法来收集该值吗 foreach Item AllItems pid pm gt start Item and next Tem
  • 如何在附加的 sqlite 数据库中创建外键?

    我正在尝试创建一个 sqlite3 数据库作为模拟生产环境的测试环境 由于生产的设置方式 表处于多个模式中 我已经在 DBIx Class 中设置了类 使用 schema gt storage gt dbh do将数据库与架构附加在一起 并
  • 无法从日志文件中提取特定信息

    我这里有日志文件我想提取以下信息 想要提取十六进制值 如果该行有第二个括号 0 9 想要提取十进制值 首先转换为十六进制 然后提取 9 gt 0x09 想要提取负值 25 先转换为十六进制然后提取 例如 25 gt FFE7 gt 想要提取
  • 如何在 Perl 中复制整个目录?

    我需要将整个目录复制到某个位置 最好的方法是什么 File Copy正如我所见 仅逐个文件复制 顺便说一句 我在Windows下工作 感谢帮助 也许调查一下文件 复制 递归 http metacpan org pod File Copy R
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • Text::平衡和多行 xml

    看来我有点失落了 我需要解析一个大的 大约 100 mb 且相当难看的 xml 文件 如果我使用parsefile 它返回错误 文档元素后的垃圾 但它会很乐意解析文件的较小元素 所以我决定将文件分解为元素并解析它们 由于不鼓励使用正则表达式
  • 为什么`Option`支持`IntoIterator`?

    我试图迭代字符串向量的一个子部分 即Vec
  • Perl 和 Selenium::远程::驱动程序

    再次编辑 我在弗吉尼亚州北部某处的 AWS 上有一台服务器 这是我的监控服务器 我从另一个状态 ssh 进入这个 Ubuntu 服务器来进行系统管理 我想在这台服务器上进行 Web 自动化测试 它将测试互联网上的 Web 应用程序 点击 U

随机推荐

  • LISTAGG 函数:“字符串连接的结果太长”

    我正在使用 Oracle SQL 开发人员版本 3 0 04 我尝试使用该功能LISTAGG将数据分组在一起 CREATE TABLE FINAL LOG AS SELECT SESSION DT C IP CS USER AGENT li
  • Repo同步后,目录下没有文件

    我已经为 Android 源代码设置了一个新的 Repo 执行 repo 同步后 repo 目录中没有文件 我错过了什么 I used repo init u git android git kernel org platform mani
  • Azure B2C。使用 Azure 门户编辑自定义属性

    我已在 Azure 门户中创建了 Azure B2C 应用程序 我只需要为此应用程序使用登录策略 无需注册 我需要创建两种用户 Simple User and Admin 为此 我创建了自定义字符串属性 Role 它通过令牌作为登录策略的声
  • PHP if ( $some_var == 1 ) 总是返回 true,即使它不是 true?

    这个问题很简单 但我不确定解决它的最佳方法是什么 如果变量包含数字 我如何确保 if 语句仅在确实存在时才返回 true some var is one PHP 是一种松散类型语言 这意味着值可以根据上下文更改其类型 当使用松散比较时 1
  • 有没有办法指定浏览器的最小和最大缩放级别?

    最近的浏览器允许使用 CTRL CTRL 鼠标滚轮以及触控板上的两根手指捏合手势来更改缩放级别 虽然我自己发现该功能非常方便 各个网站上的字体通常太小 我无法阅读 但我们进行了一些测试 其中测试人员 有意或无意 应用了非常极端的缩放级别 在
  • 反应本机 android/app/build.gradle 文件丢失

    我是本地反应新手 我想创建一个使用 firebase 推送通知的简单应用程序 所以我使用 expo init 创建了我的反应应用程序 现在我陷入了本教程的第 2 点https github com invertase react nativ
  • Microsoft JScript 运行时错误:“$”未定义

    我正在尝试使用以下代码隐藏 显示视图中的元素 buttonClass IDhere click function theDivYouWantToShowClass IDhere toggle 然而 我不断得到 Microsoft JScri
  • 如何使用 .NET 6 在 aspnet core Web 应用程序中执行 database.ensurecreated() ?

    在 NET 5 Web应用程序中 我们在startup cs中使用如下代码来使用实体框架初始化数据库 using var serviceScope app ApplicationServices GetService
  • 查找连续相等字符的最长子串时如何处理“借用的值活得不够长”错误?

    我有一个作业 要获取带有签名的连续相等字符的最长子串fn s str gt Option lt str gt 但是 我的尝试产生了编译器错误 pub fn longest sequence s str gt Option lt str gt
  • 无法解析颜色值

    我试图让我的按钮在按下时改变其文本的颜色 但我遇到了一个无法解决的问题 我收到一条错误消息 无法解析颜色值 然后它为我提供了文件的路径 这是我使用的文件 这个位于资源下名为 color 的新文件夹及其调用的按钮中
  • Android:错误:使用未声明的标识符“fseeko”

    当我尝试使用源代码在 Android 中构建 boost 库时 出现以下错误 发布 armeabi v7a D Android Sdk ndk gt 捆绑 工具链 llvm prebuilt windows x86 64 sysroot u
  • 不带数据库名称的 MySql ConnectionString 在 C# 中创建数据库

    我遇到了一种情况 我确实需要使用进入 mysql 服务器所需的连接字符串在 MYSQL 中创建一个数据库 到目前为止 我已经使用了带有数据库名称的连接字符串 所以在这种情况下 执行我的连接字符串结构是什么 创建数据库查询到 mysql 服务
  • 使用 Stack 作为全局包管理器的推荐方法

    例如 我想在全球范围内安装一些 Haskell 库hindent我的编辑器的 Haskell 集成使用了它 推荐的方法是什么 我以为stack install hindent是执行此操作的正确方法 然而 后来我想更新我的软件包 发现有没办法
  • 如何以编程方式放大/缩小 WebView 的内容?

    我正在尝试以编程方式放大 缩小应用程序中 WebView 对象的内容 但我找不到一个好的方法来做到这一点 有人可以给我一些帮助吗 如果能有一些代码示例就更好了 最后 lollypop 支持 Zoomby 但在 API 21 下 zoomin
  • React-Native:如何打开本地捆绑的二进制文件

    我正在编写一个反应本机应用程序 我希望它使用包含设备固件更新的 zip 文件进行部署 在让用户发送更新之前 我需要我的代码来打开 zip 并对其内容进行一些验证 我发现了很多 zip 处理 NPM 包 所以我需要做的就是加载文件内容 这样我
  • kubectl run 命令失败并出现连接被拒绝错误

    我正在关注 kubernetes io 上的 hellonode 教程 http kubernetes io docs hellonode http kubernetes io docs hellonode 我在尝试执行 创建您的 Pod
  • 无法使用 Actions SDK 读取意图

    我的 action json 文件中有以下操作 description Recommend movies initialTrigger intent GIVE RECOMMENDATION queryPatterns queryPatter
  • Django 1.4 - 重定向到非 HTTP url

    我们有一个重定向到非 HTTP url 方案的视图 它在 iOS 应用程序中使用 但由于我们已经升级到 Django1 4 因此执行此重定向代码时会发生崩溃 它崩溃了 myyrlscheme 的可疑操作 使用方案 appdev 不安全地重定
  • 在Linux环境下运行.bat

    有没有办法在Linux环境下运行 bat文件 我有几个 bat 文件 它们的目的是调用 mvn install install file 脚本 因此 脚本中不依赖任何操作系统 谢谢你 您可以使用wine http www winehq or
  • Perl foreach 循环变量范围

    我是 Perl 新手 在编写以下代码片段后对 Perl 作用域规则感到困惑 usr bin perl my i 0 foreach i 5 10 print i n print Outside loop i i n 我预计输出如下 5 6