首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么时候才是正确的时间(和错误的时间)使用倒计时?

什么时候才是正确的时间(和错误的时间)使用倒计时?
EN

Stack Overflow用户
提问于 2018-05-30 06:40:37
回答 2查看 0关注 0票数 0

许多初级程序员编写的代码如下:

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

  `cp $from $to`;
}

这很糟糕,为什么?应该用后背吗?如果是,怎么做?

EN

回答 2

Stack Overflow用户

发布于 2018-05-30 15:17:02

有几个人已经提到,只有在以下情况下才应该使用Backticks:

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

不幸的是,像检查返回值这样的事情恰如其分会很有挑战性的。它是死于信号吗?它运行到完成,但返回一个有趣的退出状态?试图解释的标准方法$?

建议使用capture()system()函数,而不是回退函数。capture()函数的工作方式就像倒计时一样,只是:

  • 它提供了详细的诊断,如果命令没有启动,被信号杀死,或者返回意外的退出值。
  • 如果传递受污染的数据,它提供详细的诊断信息。
  • 它为指定可接受的退出值提供了一种简单的机制。
  • 如果你想的话,它允许你在没有外壳的情况下调用backticks。
  • 它为避免shell提供了可靠的机制,即使使用单个参数也是如此。

这些命令在操作系统和perl版本之间也是一致工作的,与perl的内置版本不同。system()如果在旧版本的Perl上调用多个参数,或者在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);
票数 0
EN

Stack Overflow用户

发布于 2018-05-30 16:37:13

规则很简单:如果可以找到一个内置的代码来完成相同的工作,或者它们是CPAN上的一个健壮的模块,那么就不要使用Backticks。Backticks通常依赖不可移植的代码,即使您清除了变量,也仍然可以打开许多安全漏洞。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档