gpt4 book ai didi

perl - 何时是使用反引号的正确时间(和错误时间)?

转载 作者:行者123 更新时间:2023-12-03 21:00:36 24 4
gpt4 key购买 nike

许多初级程序员编写这样的代码:

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

`cp $from $to`;
}

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

最佳答案

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

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

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

    我建议使用 IPC::System::Simple模块的 capture()system()函数而不是反引号。 capture()函数就像反引号一样工作,除了:
  • 如果命令未启动、被信号终止或返回意外退出值,它会提供详细的诊断信息。
  • 如果传递了受污染的数据,它会提供详细的诊断。
  • 它提供了一种简单的机制来指定可接受的退出值。
  • 如果您愿意,它允许您在没有外壳的情况下调用反引号。
  • 即使您使用单个参数,它也提供了避免 shell 的可靠机制。

  • 与 Perl 的内置 system() 不同,这些命令还可以在操作系统和 Perl 版本中始终如一地工作。在旧版本的 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::System::Simple是纯 Perl,适用于 5.6.0 及更高版本,并且没有任何通常不会随您的 Perl 发行版提供的依赖项。 (在 Windows 上,它依赖于 ActiveState 和 Strawberry Perl 附带的 Win32::模块)。

    免责声明:我是 IPC::System::Simple 的作者,所以我可能会表现出一些偏见。

    关于perl - 何时是使用反引号的正确时间(和错误时间)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/115809/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com