什么时候是使用反引号的正确时间(和错误时间)?

2023-12-30

许多初学者都会写这样的代码:

sub copy_file ($$) {
  my $from = shift;
  my $to = shift;

  `cp $from $to`;
}

这很糟糕吗?为什么?应该使用反引号吗?如果是这样,怎么办?


有些人已经提到,您应该只在以下情况下使用反引号:

  • 您需要捕获(或抑制)输出。
  • 不存在内置函数或 Perl 模块来执行相同的任务,或者您有充分的理由不使用该模块或内置函数。
  • 您清理您的输入。
  • 你检查一下返回值。

不幸的是,像检查返回值这样的事情properly可能相当具有挑战性。它是否因信号而死亡?它是否运行完成,但返回一个有趣的退出状态?尝试解释的标准方法$?太糟糕了。

我建议使用IPC::系统::简单 http://search.cpan.org/perldoc?IPC::System::Simple模块的capture() and system()函数而不是反引号。这capture()函数的工作方式与反引号类似,不同之处在于:

  • 如果命令未启动、被信号终止或返回意外的退出值,它会提供详细的诊断。
  • 如果传递受污染的数据,它会提供详细的诊断。
  • 它提供了一种简单的机制来指定可接受的退出值。
  • 如果您愿意,它允许您在没有 shell 的情况下调用反引号。
  • 它提供了避免 shell 的可靠机制,即使您使用单个参数也是如此。

与 Perl 的内置命令不同,这些命令还可以跨操作系统和 Perl 版本一致地工作system()在旧版本的 Perl 上使用多个参数调用时(例如,使用多个参数的 5.6.0),它可能不会检查受污染的数据,或者在 Windows 下无论如何都可能调用 shell。

例如,以下代码片段将保存调用结果perldoc转换为标量,避免 shell,如果找不到页面则抛出异常(因为 perldoc 返回 1)。

#!/usr/bin/perl -w
use strict;
use IPC::System::Simple qw(capture);

# Make sure we're called with command-line arguments.
@ARGV or die "Usage: $0 arguments\n";

my $documentation = capture('perldoc', @ARGV);

IPC::系统::简单 http://search.cpan.org/perldoc?IPC::System::Simple是纯 Perl,适用于 5.6.0 及更高版本,并且不具有 Perl 发行版通常不附带的任何依赖项。 (在 Windows 上,它依赖于 ActiveState 和 Strawberry Perl 附带的 Win32:: 模块)。

免责声明:我是以下内容的作者IPC::系统::简单 http://search.cpan.org/perldoc?IPC::System::Simple,所以我可能会表现出一些偏见。

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

什么时候是使用反引号的正确时间(和错误时间)? 的相关文章

  • Perl 脚本的 shebang 行应该使用什么?

    哪一个用作 Perl 脚本的 shebang 行更好或更快 perl perl exe fullpath perl perl exe partialpath perl perl exe 并且 当使用 perl 当它在特定系统上运行时 我如何
  • Perl 脚本中“不在某个 shell 下运行”是什么意思?

    在许多 Perl 脚本中 特别是在著名的 CPAN 发行版中 我发现以下代码 eval exec usr bin perl w S 0 1 if 0 not running under some shell 我想知道它是做什么用的 Than
  • 我可以在 Perl 中访问动态指定类中的静态方法吗?

    是否可以在 Perl 中动态指定一个类并访问该类中的静态方法 这不起作用 但说明了我想做的事情 use Test Class1 my class Test Class1 class static method 我知道我可以这样做 class
  • 从函数返回哈希值的最佳 Perl 实践是什么?

    我正在考虑将哈希引用传递给函数或从函数返回数据的最佳实践 一方面 仅将输入值传递给函数并仅返回输出变量似乎很直观 然而 在 Perl 中传递哈希值只能通过引用来完成 因此有点混乱 而且似乎更有可能犯错误 另一种方法是在输入变量中传递引用 但
  • 如何匹配与 Perl 中的特定模式不匹配的字符串?

    我知道使用正则表达式很容易匹配除给定字符之外的任何内容 text ab ac ad text s c g Match anything except c text is now c 我不知道如何 排除 字符串而不是字符 我如何 匹配除 ac
  • Perl:管理 Windows 上的路径编码

    我正在努力处理包含非英文字符的路径 Activestate Perl Windows XP 如何打开 写入 复制等位于包含希腊语 俄语 法语重音字符的路径中的文件 假设我要将 text txt 文件复制到的目录是 C Documents a
  • 如何只读取文件的第一行

    我已经用谷歌搜索了一段时间 但我找不到只读取文件第一行的函数 我需要读取文本文件的第一行并从中提取日期 Perl 新手 open my file lt filename txt my firstLine lt file gt close f
  • 是否有与 pdl2(或 Devel::REPL)中的 perl 调试器“x”等效的东西?

    我在用pdl2 the PDL http p3rl org PDLshell 也作为我的默认 Perl 交互式 shell 它加载所有不错的插件Devel REPL http search cpan org perldoc Devel 3a
  • 如何 grep 遍历数组,同时过滤掉匹配项?

    有没有一种快速简便的方法来 grep 遍历数组 找到满足某些测试的元素and从原始数组中删除这些 例如我想要 a 1 7 6 3 8 4 b grep filter gt 5 a now b 7 6 8 and a 1 3 4 换句话说 我
  • 导入 .pl 文件

    我想知道如何将 Perl 文件导入到脚本中 我尝试了 use require 和 do 但似乎没有什么对我有用 这就是我用 require 做到的 usr bin perl require equations print x1 n 是否可以
  • Web 开发中的 Perl [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Perl 中查找数组的大小

    我似乎遇到过几种不同的方法来查找数组的大小 这三种方法有什么区别呢 my arr 2 print scalar arr First way to print array size print arr Second way to print
  • 在 Perl 中实现 CLI 工具的最佳实践是什么?

    我正在使用 Perl 实现 CLI 工具 我们可以遵循哪些最佳实践 作为前言 我花了 3 年时间为一家大型金融公司设计并实现了一个相当复杂的 Perl 命令行工具集 以下想法基本上是我们团队设计指南的一部分 用户界面 命令行选项 允许尽可能
  • 检查程序是否正在运行,如果不在 perl 中则运行它

    我想知道如何检查程序是否正在运行 如果没有则运行该程序 使用 Kill 函数向要检查的进程 ID 发送 0 零 信号 如果进程存在 函数返回true 否则返回false Example check if process 1525 is ru
  • 如何使用 Time::Piece strptime 解析微秒?

    我有一个时间戳 看起来像25 OCT 10 04 11 00 000000 AM 我正在尝试将其转换为时间格式 Time Piece gt strptime 25 OCT 10 04 11 00 000000 AM d b y I M S
  • 如何在 Perl 中运行匿名函数?

    sub print 1 sub print 1 我尝试了各种方法 都是错误的 sub 将为您提供指向该函数的指针 因此您必须通过引用调用 sub print Hello world n gt 另一种简单的方法 如所指出的布拉戈维斯特 布尤克
  • 为什么不鼓励在 Windows 上将 PPM perl 模块与 Strawberry perl 一起使用?

    任何人都可以解释为什么人们会发表此评论吗 我在 stackoverflow 上看到了几个线程 像这个 https stackoverflow com questions 6643939 installing modules using st
  • 如何将 cpanminus 与本地 CPAN::Mini 一起使用?

    我已经创建了自己的 CPAN 本地副本minicpan http search cpan org rjbs CPAN Mini 1 111007 bin minicpan并设法重新配置 cpan 来使用它 太棒了 但是我将如何使用它cpan
  • 使用 Perl 写入文件的最简单方法是什么?

    目前我正在使用 system echo panel login panel password root name root pass port panel type gt gt home shared ftp 使用 Perl 做同样的事情最
  • Mason 方法范围 - 覆盖

    Using Mason2 https metacpan org pod Mason 有 3 个组件 Base mc tmp Base mc tmp index mc The tmp index mc内容 hello from the Som

随机推荐

  • 谷歌浏览器本地存储保存在哪里?

    某些网站显示正在使用本地存储 在 Google Chrome 中 CTRL I 资源选项卡 本地存储 例如 StackOverflow 有一个 login prefs 键和我的默认登录提供程序 所以据我所知它是一个 json 对象 这些数据
  • Spring embeddeb 数据库表已存在错误

    我正在尝试使用嵌入式数据库运行 Spring Boot 应用程序 在 bean 初始化期间 由于某种原因 我的表创建脚本被调用两次 第二次调用失败 并出现 表已存在 错误 下面是我的代码 可能是什么问题 Configuration publ
  • MatLab - 将函数应用于矩阵中的每一行

    我有一个矩阵 行数为 4 个整数 列数未指定 取决于文本文件 我想独立地将函数应用于矩阵的每一行 该函数有 4 个输入和 2 个输出 我尝试使用 arrayfun 函数来执行此操作 但每当我调用该函数时 都会收到一条错误消息 输入参数不足
  • 如何在木偶上使用参数化正则表达式(例如/${user}/)进行测试?

    我需要获取用户的主目录 我决定通过解析 getent passwd 字符串来获取它 这是一个自定义事实构建为 内容的串联 etc passwd 并借助正则表达式提取相关信息 当我测试 getent带有固定字符串 adam 提取工程 if g
  • 如何在C#中使用Either类型?

    佐兰 霍瓦特 https www pluralsight com authors zoran horvat提议使用Either类型以避免空检查和不要忘记处理问题在执行操作期间 Either在函数式编程中很常见 为了说明其用法 Zoran 展
  • 如何对“新风格”Django 中间件进行单元测试

    我正在学习如何对 Django 中间件进行单元测试 在 旧式 中间件中 使用以下命令加载中间件非常容易process request 测试结果 例如 def test session self request self factory ge
  • 衍生品警告没有意义

    我收到以下形式的警告 DerivativesWarning Constraints or objectives traj linkages stage 1 grav turn alpha final coast 1 alpha initia
  • 错误显示:dyld_sim 与加载的进程不兼容

    我有一个 iPhone 中运行的应用程序的源代码 适用于 iOS 7 及之前的操作系统 但 iOS 8 0 及更高版本不支持该应用程序 当我尝试编译代码时 它可以正常执行所有文件 但会引发体系结构不匹配错误 在控制台中 dyld dyld
  • 如何更改查询以仅保留叶节点

    我有包含以下数据的表 id parent id short name 6 5 cpu 7 5 ram 14 9 tier a 15 9 rfc1918 16 9 tolerant 17 9 nononymous 13 12 cloudsta
  • HTTPServletRequest getParameterMap() 与 getParameterNames

    HTTPServletRequestreq 有一个方法getParameterMap 但是 这些值返回一个String 代替String 对于发布数据为 姓名 玛丽 姓氏 约翰 年龄 20 我在帖子数据中看到它不是一个数组 但是getPar
  • AngularJS 根据用户输入切换样式表

    如何根据用户单击的按钮来切换 切换 AngularJS 页面的样式表 您实际上可以在 html 级别放置一个控制器并修改link标签的href Demo http plnkr co edit jBtP6FfmeRzOYUCnHg3t p p
  • 如何检测通知/系统栏何时打开

    我需要知道系统 通知栏何时在我的应用程序中打开 但我找不到任何真正的解决方案 所以我将一些东西组合在一起 看起来效果很好 在详细介绍实现之前 我将简要解释一下我的 非常老套的 逻辑 当某个 Activity 由于任何原因不再对用户可见时 将
  • xtensor 类型与 NumPy 简单归约的性能对比

    我正在尝试xtensor python https github com QuantStack xtensor python并开始编写一个非常简单的求和函数 之后使用千篇一律的设置 https github com QuantStack x
  • TypeORM - 如何在生产模式下创建新表并自动运行迁移?

    我想在 MySQL 中创建新表 并在应用程序在生产模式下运行时自动运行 TypeORM 迁移 注意 此新表不是在生产模式下启动应用程序之前创建的 根据迁移文档 https github com typeorm typeorm blob ma
  • 在Jupyter中逐步执行算法

    我试图一步步展示 Jupyter 中 Python 程序的执行情况 例如 我可以将程序中变量的值可视化 如以下玩具程序所示 from IPython display import display clear output from time
  • 如何在 pygtk 中使用线程

    我在 pygtk 中遇到线程问题 我的应用程序包含一个从互联网下载图片然后用 pygtk 显示它的程序 问题是 为了做到这一点并保持 GUI 响应能力 我需要使用线程 因此 在用户单击 下载图片 按钮后 我进入回调 并调用该方法来下载同一类
  • 将 CV_32FC1 类型的矩阵转换为 CV_64FC1

    如何将 CV 32FC1 类型的 cv Mat 转换为 CV 64FC1 类型 相当于从 float 变为 double 我正在打开一个保存为 XML 的矩阵 cvSave 但作为浮动 这意味着该领域 dt 有价值f在文件中 我需要将其更改
  • 在函数内修改Python中的全局字典

    usr bin env python def modify dict d two 2 d one 1 modify dict print d I get globaltest py two 2 one 1 我本来希望只看到 one 1 因为
  • Matlab:xcorr一维互相关归一化问题

    我有一个长度 5 的参考信号 s1 和另一个长度 25 个样本的信号 s2 包含相同 5 个样本信号 s1 的移位版本 我想找到两个信号之间的归一化互相关性 以计算信号 s1 和 s2 之间的样本距离 延迟 滞后 我用零填充 s1 因此它与
  • 什么时候是使用反引号的正确时间(和错误时间)?

    许多初学者都会写这样的代码 sub copy file my from shift my to shift cp from to 这很糟糕吗 为什么 应该使用反引号吗 如果是这样 怎么办 有些人已经提到 您应该只在以下情况下使用反引号 您需