在 Perl 中使用 foreach 或 while 迭代文件有什么区别?

2024-01-23

我有一个文件句柄FILE在 Perl 中,我想迭代文件中的所有行。以下有区别吗?

while (<FILE>) {
    # do something
}

and

foreach (<FILE>) {
    # do something
}

对于大多数用途,您可能不会注意到差异。然而,foreach将每一行读入list (不是数组 http://perldoc.perl.org/perlfaq4.html#What-is-the-difference-between-a-list-and-an-array%3f)在逐行浏览之前,而while一次读取一行。作为foreach会使用更多内存并需要预先处理时间,通常建议使用while迭代文件的行。

编辑(通过Schwern):foreach循环相当于:

my @lines = <$fh>;
for my $line (@lines) {
    ...
}

不幸的是,Perl 没有像对范围运算符那样优化这种特殊情况(1..10).

例如,如果我用 a 读取 /usr/share/dict/wordsfor循环和一个while循环并让他们在完成后睡觉我可以使用ps查看该进程消耗了多少内存。作为控件,我包含了一个打开文件但不执行任何操作的程序。

USER       PID %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
schwern  73019   0.0  1.6   625552  33688 s000  S     2:47PM   0:00.24 perl -wle open my $fh, shift; for(<$fh>) { 1 } print "Done";  sleep 999 /usr/share/dict/words
schwern  73018   0.0  0.1   601096   1236 s000  S     2:46PM   0:00.09 perl -wle open my $fh, shift; while(<$fh>) { 1 } print "Done";  sleep 999 /usr/share/dict/words
schwern  73081   0.0  0.1   601096   1168 s000  S     2:55PM   0:00.00 perl -wle open my $fh, shift; print "Done";  sleep 999 /usr/share/dict/words

The for程序消耗了近 32 兆的实际内存(RSS列)来存储我的 2.4 meg /usr/share/dict/words 的内容。这while循环一次仅存储一行,仅消耗 70k 的行缓冲。

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

在 Perl 中使用 foreach 或 while 迭代文件有什么区别? 的相关文章

  • 用 C 更快地读取文件

    嗯 我想知道是否有一种比使用 fscanf 更快地读取文件的方法 例如假设我有这个文本 4 55 k 52 o 24 l 523 i 首先 我想读取第一个数字 它给出了接下来的行数 令这个数称为N N 之后 我想读取 N 行 其中有一个整数
  • PHP上传问题

    我使用了一些脚本来开始在我的开发计算机上上传文件 问题是 尽管此操作预期很容易 但每当我尝试上传图像时 Apache 似乎都会超时 上传设置为On和tmp目录设置在php ini 我尝试上传主要内容gif来自谷歌 一个8 36KB图像 它应
  • 如何在 perl 程序中查找打开的全局文件句柄

    我刚刚发现一个问题 我必须关闭所有打开的文件句柄才能让我的 Apache cgi 脚本继续 我将问题追溯到 Parse RecDescent usr bin env perl use strict use warnings use feat
  • 如何在调试器模式下运行 perl 测试?

    我尝试在调试器下运行测试 perl d which prove t file t 但这没有任何效果 因为每个测试都是作为单独的作业运行的 我已经发现 exec选项 但是当我提供它时 我失去了任何选项 proverc文件和命令行 prove
  • 从 Java 应用程序读取的文件是否会调用系统调用?

    我的理解是 请求文件系统路径 例如 aFile 的用户应用程序将调用文件系统并获取所请求文件的虚拟地址 然后应用程序将尝试以该地址作为参数 即作为 CPU 指令 进行读 写操作 执行读取命令时 内存管理单元会将该地址转换为物理地址 并查看页
  • 如何为自定义 Perl 模块选择一个不与内置或 CPAN 包名称冲突的包名称?

    我已阅读模块上的 perldoc http perldoc perl org perlmod html 但我没有看到关于命名包的建议 这样它就不会与内置或 CPAN 模块 包名称冲突 过去 为了开发本地Session pm模块 我使用我公司
  • For...VBA 中的下一个循环超出限制

    我正在使用一个For Next循环填充数组 如下所示 ReDim array 1 to 100 1 to 100 For i 1 to 100 Next i But the i计数器似乎总是转到 101 而不是停止在 100 因此 这会在我
  • 使用 for 循环填充 python 字典列表

    我试图用 for 循环填充字典列表 但最终结果显示 for 循环填充的最后一个字典覆盖了所有先前字典的值 我尝试调整以下中提出的解决方案 如何使用循环填充 Python 字典 https stackoverflow com question
  • 对 os.listdir 文件进行排序 Python

    如果已下载数年的数据 这些数据存储在具有以下命名约定的文件中 year day dat 例如 名为 2014 1 dat 的文件包含 2014 年 1 月 1 日的数据 我需要按天排序读取这些数据文件 2014 1 dat 2014 2 d
  • 如何在 perl 中合并两个数组,交替每个数组中的值

    假设我有 2 个如下所示的数组 a1 Vinay Raj harry b1 dude rock 合并后我想要这样的结果 Vinay dude Vinay rock Raj dude Raj rock harry dude harry roc
  • 向用户提示多个问题(是/否和文件名输入)

    我想问用户多个问题 我有两种类型的问题 是 否或文件名输入 我不知道如何将这一切放入一个好的if结构 我不确定是否也应该使用 else 语句 有人可以帮我们解决这个问题吗 这是我到目前为止所拥有的 print Do you want to
  • 如何正确导入主代码和模块中同时使用的模块?

    假设我有一个主脚本 main py 它导入另一个 python 文件import coolfunctions另一个 import chores 现在 假设 Coolfunctions 也使用家务活中的东西 因此我声明import chore
  • 如何将 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 CGI 脚本提供图像?

    我的 Google fu 让我失望了 如何使用 Perl 提供已生成的图像 Example img src getimage pl getimage pl 里有什么 干得好 usr bin perl w my file inner nav
  • 如何对 Data::Dumper 的输出进行排序?

    我想转储对象和散列的值 但它总是乱序打印键 如何按 递归 排序顺序转储键 use Data Dumper print Dumper obj Set Data Dumper Sortkeys 1获取 Perl 的默认排序顺序 如果要自定义顺序
  • 有没有办法匹配任意 Unicode 字母字符?

    我有一些文档经过 OCR 从 PDF 转换为 HTML 因此 他们最终会出现很多随机的 unicode 标点符号 而转换器会搞砸 即省略号等 他们还正确地有一堆非英语但仍然是字母字符 如 和俄语字符等 有没有办法制作一个匹配任何 unico
  • 无法从日志文件中提取特定信息

    我这里有日志文件我想提取以下信息 想要提取十六进制值 如果该行有第二个括号 0 9 想要提取十进制值 首先转换为十六进制 然后提取 9 gt 0x09 想要提取负值 25 先转换为十六进制然后提取 例如 25 gt FFE7 gt 想要提取
  • grep 两个分隔符之间的子字符串

    我有很多bash使用的脚本perl内的表达式grep为了提取两个分隔符之间的子字符串 例子 echo BeginMiddleEnd grep oP lt Begin End 问题是 当我将这些脚本移植到运行的平台时busybox 融合的 g
  • R - 与 SpatialPolygonsDataFrame 对象相交的 SpatialLinesDataFrame 列表的嵌套循环

    我有一系列需要完成的步骤SpatialLinesDataFrame 此处的 线 基于对象与多特征中各个特征的关系SpatialPolygonsDataFrame 多边形 对象 简而言之 每个线列表元素源自单个面要素内部 并且可能会也可能不会

随机推荐

  • 用于图像分割的 U-Net 迁移学习 [Keras]

    刚刚开始使用卷积网络并尝试图像分割问题 我为 dstl 卫星图像特征检测竞赛拿到了 24 张图像及其掩模 https www kaggle com c dstl satellite imagery feature detection dat
  • 如何列出 Mercurial (hg) 中存储库中的所有文件?

    Mercurial 中是否有一个命令可以列出当前受源代码控制的所有文件 我可以做一个dir s列出我的文件夹和子文件夹中的所有文件 但我不知道哪些文件已添加到我的存储库中 我有各种排除的文件类型和文件夹 我想验证在将它们设置到 hgigno
  • C For 循环跳过第一次迭代和循环 scanf 中的虚假数字

    我正在为学校创建一个邮件标签生成器 但遇到了一些问题 我的程序是获取从 0 到 10 的个人的全名 地址 城市 州和邮政编码 运行我的程序时 我遇到两个主要问题 for 循环跳过全名 safergets 并转到地址safergets 我继续
  • 如何动态添加槽值到Alexa技能

    我是 Alexa 开发的新手 我已使用 AWS lambda 函数和 Node js 代码成功创建了 Alexa 技能 这是我的意图模式 intents slots name locationName type LOCATION LIST
  • 如何将单选按钮与 html 中的图像垂直居中对齐?

    我有多个 100x100 的图像 我要求用户通过在每个选项前放置一个单选按钮来选择其中一个 这是代码 div div
  • 为什么 PowerShell 会分割包含连字符和句点的参数?

    在 PowerShell 窗口中 PS C gt echo abc def ghi abc def ghi 由于某种原因 连字符和句点的组合导致 Powershell 将参数分成两行 如果没有连字符 则不会出现 PS C gt echo a
  • 如何在 Perl CGI 脚本中生成长时间运行的进程?

    我现在正在编写一个 Perl CGI 脚本 但它正在成为资源消耗者 并且它不断被我的 Web 主机杀死 因为我不断达到进程内存限制 我想知道是否有一种方法可以将我的脚本拆分为多个脚本 然后让第一个脚本调用下一个脚本 然后退出 这样整个脚本就
  • 我的 wordpress wp-api 测试数据中缺少什么?

    我正在使用 wp api 进行测试 顺便说一句 我很高兴使用它 这是我所做的 安装了 wp api 并验证我可以使用 cURL 从网站获取 安装了基本身份验证 并为此测试创建了编辑器级别帐户 我尝试在 Chrome 中使用 cURL 和 P
  • 在 AngularJS 中的 ng-repeat 中使用 ng-model 进行绑定

    我正在尝试将模型 用户 绑定到输入字段列表 我事先不知道这些字段 所以我必须编写通用代码来根据字段设置表单 div ul li li ul div
  • Material UI / Webpack / React - 生产模式下的类名优化/缩小

    webpack v4 material ui v4 9 6 react v16 12 0 通常情况下 所有类都应该是第一个示例中的最后一个类 由于生产模式上的某些原因 许多类没有改变 任何想法 示例1 div class MuiDrawer
  • 如何在旧版(非 WebExtensions)Firefox 插件中获取 Windows 用户名?

    我正在使用 Firefox 插件 用 JavaScript 编写 需要确定当前登录的 Windows 用户 有没有办法做到这一点 这在 Windows 上可以解决问题 function getUser return Components c
  • Spring Boot 中的 JSON Java 8 LocalDateTime 格式

    我在 Spring Boot 应用程序中格式化 Java 8 LocalDateTime 时遇到一个小问题 对于 正常 日期 我没有问题 但 LocalDateTime 字段会转换为以下内容 startDate year 2010 mont
  • 在 C++ 中找到一对椭圆的公切线的首选方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想用 C 来做这个 我有两个想法可以做到这一点 将这对椭圆视为两个不同参数的参数方程 我可以根据这两个参数得到两个方程 这对方程是非
  • 如果没有const引用临时对象会被删除吗?

    我们来看看这两个函数 std string get string std string ret value Calculate ret value return ret value void process c string const c
  • 广播有延迟

    我们使用广播来传达远程服务和 UI 之间的状态更改 这样做时 我们发现了一个非常奇怪的行为 有时 我找不到任何线索为什么 这些广播会延迟 8 秒左右 我们如何发送它们 非常基本 mState只是一个枚举 服务中的远程进程 Intent in
  • D3 反转色标图以获得幅度

    我有一个 colorscaleMap 让我们假设这样的事情 d3 scale linear domain 0 01 0 02 0 03 0 04 0 05 range 5100ff 00f1ff 00ff30 fcff00 ff0000 现
  • 将文件存储在批处理文件中?

    您好 我正在尝试将二进制文件存储在我编写的基本批处理脚本中 基本上我希望脚本能够在某个时候输出这个预构建的文件 而不是从头开始创建它 如果这是不可能的 那么我必须将此文件与批处理文件分开包含 然后将其移动到必要的位置 但我宁愿让此文件对用户
  • 我可以从 node.js 设置 ulimit 吗?

    我想限制子进程写入太多数据或占用太多CPU时间 无限循环 在 C 中 我会调用 setrlimit 2 来做到这一点 Node js中有类似的东西吗 据我所知 没有node js扩展提供setrlimit 功能 但您可以通过一个小的 she
  • PHP 准备好的语句返回 -1

    我使用准备好的语句已经有一段时间了 从来没有遇到过任何问题 现在我正在尝试 sql SELECT PhotoID Caption FROM Photos WHERE EntityID AND TypeID LIMIT iDB new mys
  • 在 Perl 中使用 foreach 或 while 迭代文件有什么区别?

    我有一个文件句柄FILE在 Perl 中 我想迭代文件中的所有行 以下有区别吗 while