【问题标题】:Why is the backticks operator in Perl not working without the quotes on Windows?为什么 Perl 中的反引号运算符在 Windows 上没有引号就不能工作?
【发布时间】:2014-07-07 21:10:52
【问题描述】:

我对 Perl 还很陌生,所以如果问题很琐碎,请原谅我。

在工作中,我有一项任务是创建一个脚本,该脚本会在其他开发人员错过任务的截止日期时发送电子邮件。由于整个事情必须在 Windows 上运行,使用 Strawberry Perl,我使用 Windows 命令date /T 来执行日期检查。我使用反引号运算符调用了很多外部命令,但在这种特殊情况下,反引号不起作用:

my $date = `date /T`;

输出:

date: invalid date `/T'

使用一些额外的引号修复:

 my $date = `"date /T"`

输出:

Mon 07/07/2014

我的问题是:为什么会这样?

如果其他带有反引号的外部调用也能正常工作,我会明白这一点,但这是我唯一必须这样调用才能使其工作的方法。

【问题讨论】:

  • 不带引号对我有用。
  • 排除引号时会发生什么(除了“不工作”)?
  • 你在使用 Cygwin 吗?在命令提示符下,date /T 有效。在 Cygwin 下,date /T 给出date: invalid date `/T'
  • 听起来好像在不带引号的情况下调用它时,它会根据cygwin的路径指向cygwin的date可执行文件。当你用引号调用它时,它使用的是 Window 的 date 可执行文件,基于你的 Windows 路径。进入 Cygwin 并输入 which datetype date,你会发现你没有使用 Windows 日期。
  • 为什么不使用纯 Perl 方法来获取日期?例如use Time::Piece; my $t = localtime; print $t->strftime('%a %d/%m/%Y'); 这使您不必 1) 检查外部命令中的错误,2) 担心不同平台上外部命令之间的差异,以及 3) 担心烦人的引用问题。

标签: perl strawberry-perl


【解决方案1】:

您似乎不小心使用了date 的 Cygwin/GnuTools 版本。

在 Windows 命令提示符下,date /T 给出当前时间。
这不是一个可执行文件,这是一个命令

但是,在 Cygwin/GnuTools 环境下运行 date /T 会得到 date: invalid date '/T'
这是因为环境1) 看不到Windows date 命令2) 找到了date 可执行文件 em> 在他们的 PATH 环境变量中并运行它。

【讨论】:

    猜你喜欢
    • 2015-12-04
    • 2012-10-13
    • 2011-04-10
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多