使用“for”来主题化变量显然是不好的。为什么?

2024-01-08

So 我在 SO 上回答了一个问题,但遭到了很多批评 https://stackoverflow.com/a/44046189/1848654。 我使用 Perl 已经很多年了,而且经常使用这个主题。

让我们从一些代码开始。我在这些示例中进行搜索和替换。想法是寻找one and three从两个字符串中取出并替换它们。

$values = 'one two three four five';
$value2 = 'one 2 three four 5';

$values =~ s/one//g;
$values =~ s/three//g;

$values2 =~ s/one//g;
$values2 =~ s/three//g;

这段代码很简单,大家都接受。

我还可以构建一个数组或散列,其中包含要搜索和替换的值列表,这也是可以接受的。

但是,当我构建一个脚本来进行主题化时$values and $values2并减少构建脚本的打字量,这似乎被误解了?

这是代码。

$values = 'one two three four five';
$value2 = 'one 2 three four 5';

for ( $values, $values2 ) {
    s/one//g;
    s/three//g;
}

上面的代码将在持续时间内对变量进行主题化for块,但许多程序员反对这一点。我想了解为什么这是不可接受的?


有几点需要考虑。


您的代码对变量列表执行多次替换。您无需使用即可做到这一点$_:

for my $s ($values, $values2) {
    $s =~ s/one//g;
    $s =~ s/three//g;
}

我个人认为上面的代码没有什么问题。

一般问题是$_是它不是局部变量。例如。如果你的身体for循环调用一个函数(调用一个函数...)来修改$_无需本地化它(例如,通过分配给它或使用裸s///或使用while (<...>)),那么它将覆盖您正在迭代的变量。与一个my您的变量受到保护,因为其他函数无法看到您的局部变量。

也就是说,如果你的其余代码没有这个错误(乱写$_没有本地化),$_在这里会工作得很好。


然而,人们最初抱怨的答案中的代码是不同的:

for ($brackets) {
    s/\\left/(/g;
    s/\\right/)/g;
}

在这里,您并不是试图对许多变量执行相同的替换;而是尝试对多个变量执行相同的替换。你只是通过摆脱$brackets =~ part:

$brackets =~ s/\\left/(/g;
$brackets =~ s/\\right/)/g;

使用显式循环变量不是解决方案,因为您仍然需要输入$foo =~在每一行。

这更多是一个品味问题。你只使用for为了它的混叠效果,不要循环多个值。就我个人而言,我对此还是很满意的。

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

使用“for”来主题化变量显然是不好的。为什么? 的相关文章

  • 如何有效地计算 Perl 中覆盖给定范围的范围?

    我有一个大约 30k 范围的数据库 每个范围都作为一对起点和终点给出 12 80 34 60 34 9000 76 743 我想编写一个 Perl 子例程来表示一个范围 不是来自数据库 并返回数据库中完全 包含 给定范围的范围数 例如 如果
  • Perl OO 方法调用第一个参数值 (->)

    就 Perl OO 而言 到底做了什么 gt do 例如我拨打 main 电话 result a b gt mymethod 在我定义的包中mymethod 我使用以下内容 my class 总的来说 我显然没有向mymethod 那么哪里
  • 当一个模块安装了两个版本时 Perl 会做什么?

    我在正在使用的远程机器上没有 root 访问权限 因此我使用 cpanm 和 local lib 的组合 如下所述here https stackoverflow com a 2980715 1156644将 CPAN 模块安装到我的本地目
  • Perl Mongo 查找对象 ID

    你会认为这是一件简单的事情 我有一个集合中的对象 ID 列表 我想根据对象 ID 获取单个记录 谷歌搜索过 但没有任何帮助 所以我有对象 ID 5106c7703abc120a04070b34 my client MongoDB Mongo
  • 我的 Perl 脚本中的 findnodes 语句有什么问题?

    我有一个简单的 xml 文件 如下所示
  • 使用 Getopt::Long 解析参数的最简洁方法

    我使用 GetOpt 来解析命令行参数 我想添加一个新选项 multi 它应该得到一个如下所示的字符串 key1 abc key2 123 key3 xwz 我不知道用户想要提供多少个自定义密钥 但他可以提供 minimax5键 另外 我想
  • 如何在 BEGIN 块之外正确声明哈希?

    考虑这个简单的程序 您能解释一下为什么在取消注释前两行后输出会有所不同吗 我的哈希发生了什么use strict 如何修复程序以供使用use strict echo e key1 nkey2 nkey3 perl lne use stric
  • 如何在 Perl 脚本中包含另一个文件中的函数?

    这似乎是一个非常简单的问题 但不知何故 我的 Google Fu 失败了 在 Perl 中包含其他文件中的函数的语法是什么 我正在寻找类似C的东西 include blah h 我看到了使用 Perl 模块的选项 但这似乎需要对我当前的代码
  • 找不到 DBI.pm

    我正在尝试启动这个脚本 usr bin perl use DBI my dbh DBI gt connect dbi Oracle host lonlin2 sid TIMFX1AD port 1524 xbsesdbo xbsesdbo1
  • OpenSSL DH 密钥太小错误

    我正在尝试使用简单的 PERL 脚本连接到封闭的服务器 空调 usr bin perl use 5 10 1 use warnings use strict use IO Socket SSL use IO Socket SSL qw de
  • 由于 lpcap,CPAN 安装 Net::Pcap 和 Packet 模块失败

    最近 我尝试通过 cpan 安装 perl 模块 Net Packet 和 Net Pcap 但它抱怨找不到 pcap 库 所以我正在搜索 cpan 在安装模块时是否接受外部 lib include 目录 但到目前为止还没有运气 looki
  • 向用户提示多个问题(是/否和文件名输入)

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

    我想逐句读取文本文件 我的问题是下面的代码仅根据时期分开 usr bin perl use strict use warnings my file data txt open FILE file my buffer while my sen
  • 如何在附加的 sqlite 数据库中创建外键?

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

    我这里有日志文件我想提取以下信息 想要提取十六进制值 如果该行有第二个括号 0 9 想要提取十进制值 首先转换为十六进制 然后提取 9 gt 0x09 想要提取负值 25 先转换为十六进制然后提取 例如 25 gt FFE7 gt 想要提取
  • 检查一个数字是 int 还是 float

    在perl中 我想检查给定变量是否包含浮点数 为了检查我正在使用的 my Var 0 02 Floating point number if int Var Var floating point number 但上面的代码对于 0 0 不起
  • Perl 语言的目标是在运行时生成快速的程序吗?

    最近有朋友告诉我 看 Perl 从来就不是为了快而设计的 真的吗 我能找到的相关信息是来自维基百科 http en wikipedia org wiki Perl Overview 该语言旨在实用 易于使用 高效 完整 而不是美观 微小 优
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • Text::平衡和多行 xml

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

    我有一个使用 perl LWP 向客户发送数据的系统 他们可以选择 URL 以及是 POST 还是 GET 一位新客户最近抱怨该服务不起作用 他们怀疑这是因为他们的端点使用了 SNI SSL 查看日志 我看到的只是错误消息 证书验证失败 5

随机推荐

  • android:如何在我的应用程序中实现像 Go Launcher 这样的首次教程?

    Go Launcher 有一个很好的初次使用教程 它与 Stock ICS 首次运行非常相似 我想学习如何在第一次启动我的应用程序时显示类似的教程 如何在我的 Android 应用程序中实现这个透明视图 与屏幕对象交互 我试图做相似的东西
  • 如何创建根据另一列计算的列?

    我需要创建一个专栏age在 SQL Server 数据库中 该列的值应根据该列的值计算DOB 它的值也应该增加Age增加 您应该使用计算列来解决此问题 其定义与此类似 ALTER TABLE Customers ADD Age AS dat
  • 如何让div换行

    我是CSS初学者 我想像这样将新的 div 放入新行中 我尝试这样的代码 div div
  • css 内联块和引导网格系统输出

    我正在尝试有一个具体的HTML我的 div 的标记使用css and bootstrap 3 2 下图展示了我想要得到的结果 我使用了引导网格系统 以便我的页面能够响应并在小屏幕设备中正确显示 这是我尝试过的代码 我用过http www b
  • 与字符串数字匹配 - 无法访问的代码

    scala 新手 似乎无法让我的匹配表达式工作 我已经了解了语句评估方式之间的差异 例如 一个新变量与声明的变量相对 但似乎无法使反引号或大写起作用 declared inside of object val numberOne 17201
  • Jersey:将值从 ContainerRequestFilter 传递到端点

    我正在使用 Jersey 2 9 并且创建了一个过滤器 它将采用加密的标头值 对其进行解密 然后将其传递到被调用的端点 我不知道如何做到这一点 我一直在互联网上搜索 但没有真正找到我想做的事情的具体例子 过滤器被调用 我只是在将值从过滤器传
  • 有没有办法将正则表达式更改为 Ruby on Rails 中的数字范围?

    我经常需要在正则表达式中创建数字范围 所以例如 2 3 0 9 是 20 39 之间的数字范围 为了仔细检查我的范围 我通常使用 Linux 命令 对于 2 3 0 9 Linux 命令为 seq 1 40 egrep 2 3 0 9 它为
  • 绑定失败:地址已被使用

    我正在尝试将套接字绑定到以下端口 if bind socket desc struct sockaddr server sizeof server lt 0 perror bind failed Error return 1 puts bi
  • NSDateFormatter 区别

    这两种日期格式有什么区别 第一个给出实际时间 第二个给出时间购买添加时区偏移值 NSDateFormatter dateFormatter NSDateFormatter alloc init dateFormatter setTimeZo
  • 检查 boost::variant 是否为 null

    我的程序中有一个 boost variant 我想检查该变体本身是否已初始化 以及其类型之一中是否包含值 我已经尝试过对该变体使用empty 但这似乎不起作用 检查 NULL 也不行 有谁知道如何检查这个吗 编辑 好的 看起来它永远不会为空
  • 在 Firefox 中打开一个新选项卡并将 ff 保留在后台

    是否有一种方法可以在 Firefox 中以编程方式在新选项卡中打开 URL 而无需 Firefox 获得焦点 到目前为止我发现了什么 firefox new window
  • 如何使用Radio.Group Antd设置检查?

    我有无线电绘制的动态数据 有一个活动无线电的 ID 它也是动态生成的 如何比较 id 并安装与 Radio Group 的检查 最后我需要获取表单中的单选值 该代码无法正常工作 动态数据可能会更大 const dynamiclyData i
  • FontForge:将字体的单独字形批量导出到 svg 文件中?

    是否可以将单个字形从字体批量导出到 SVG 而无需手动将它们一一导出 相关 但相反 将一系列 svg 文件作为字形导入 FontForge 并输出字体文件 https stackoverflow com questions 22124130
  • Screen.AllScreens 错误并将 WM_DISPLAYCHANGE 发布到单个 WinForm 应用程序

    首先 对这么长的帖子表示抱歉 关于如何限制 WM DISPLAYCHANGE 消息的发布范围有什么建议吗 设想 Screen AllScreens返回在客户端上检测到的所有监视器的坐标和分辨率的数组 如果在工作站锁定时启动应用程序 在夜间应
  • 有没有办法部分解构结构?

    我有一个结构 struct ThreeDPoint x f32 y f32 z f32 我想要提取两个实例化后的三个属性 let point ThreeDPoint ThreeDPoint x 0 3 y 0 4 z 0 5 let Thr
  • jquery 在通过ajax提交表单之前通过ajax验证电子邮件

    我有一个个人资料创建表单 其中有一个电子邮件地址字段 我需要确保用户输入的电子邮件地址格式有效 并且尚未使用 对于格式检查 我有一个简单的客户端验证 由 isValidEmailAddress 函数执行 效果很好 对于我需要检查电子邮件地址
  • 使用 Go 语言进行测试的正确包命名

    我在 Go 中看到了几种不同的测试包命名策略 想知道每种策略的优缺点以及我应该使用哪一种 策略一 文件名 github com user myfunc go package myfunc 测试文件名 github com user myfu
  • 相同的查询 - 不同的执行计划

    SQL 2008 我有一个测试表 create table Sale SaleId int identity 1 1 constraint PK Sale primary key Test1 varchar 10 null RowVersi
  • pip 可以从 setup.cfg 安装,就像从需求文件安装一样吗?

    根据setuptools文档 https setuptools readthedocs io en latest setuptools html configuring setup using setup cfg files setupto
  • 使用“for”来主题化变量显然是不好的。为什么?

    So 我在 SO 上回答了一个问题 但遭到了很多批评 https stackoverflow com a 44046189 1848654 我使用 Perl 已经很多年了 而且经常使用这个主题 让我们从一些代码开始 我在这些示例中进行搜索和