【问题标题】:how to get the value of last executed command in strawberry perl如何在草莓perl中获取最后执行命令的值
【发布时间】:2020-02-12 16:25:06
【问题描述】:

我正在尝试执行一个简单的草莓 perl 脚本进行文件复制,以从最后执行的命令中获取代码。但在所有情况下我都得到 0/success。

来自我的 test.pl 脚本的代码

use File::Copy;  
use strict;
use warnings;

my $source_file = "D:\\abc\\def\\in\\test\\test1.csv";
my $target_file = "D:\\abc\\def\\in\\test\\test2.csv";

if ( copy( $source_file, $target_file ) == 0 ) {
    print "success";
} 
else { print "fail"; }

由于我使用的路径 D:\\abc\\def\\in\\test\\test1.csv 在机器上不存在,所以我预计会失败,但无论我提供什么,我都会成功。

下面的执行和输出:

D:\pet\common\bin\backup>perl test.pl 成功

【问题讨论】:

  • 这是我的第一篇文章,所以请原谅文章的格式
  • copy 在失败时返回假/零(它不像system
  • 非常感谢 David O 和​​ ikegami !它解决了这个问题。

标签: perl error-handling copy file-copying strawberry-perl


【解决方案1】:

如果您查看perldoc File::Copy,您将看到以下内容:

RETURN
    All functions return 1 on success, 0 on failure. $! will be set if an
    error was encountered.

因此,如果出现错误,您的代码应该暴露 $! 中的内容:

if ( copy($source_file, $target_file)) {
    print "success\n";
} 
else { 
    warn "fail: $!\n";
}

此外,如 File::Copy 的文档中所述,copy 在成功时返回 1(真实值),因此我在成功测试中删除了您的 == 0。使用 Perl,if(COND){...} 语句中的任何真值都可以;您不需要显式测试1

关于路径:/ 字符可用作路径分隔符,即使您使用的是 Windows,但在某些情况下您可能会将路径发送到外部程序。此功能允许您以相对可移植的方式编写将路径表示为foo/bar/baz 的代码,并且它将与 Windows 一起工作,就像它在 *nix 操作系统下的工作方式一样。使用正斜杠作为分隔符可以避免转义路径中的每个反斜杠:foo\\bar\\baz

【讨论】:

  • 大多数外部程序也会接受/,因为/ 实际上完全由Windows 本身支持。 (Perl 不会将/ 转换为\ ;它只是将带有/ 的路径传递给操作系统。)问题通常来自/ 被视为命令行开关的开始,这个问题可以通常通过使用引号来规避。 (dir c:/temp 不好;dir "c:/temp" 好的)
  • 正确:这记录在 perldoc perlport perldoc.perl.org/perlport.html#DOS-and-Derivatives 中,尽管您的示例很好,并且缺少文档。
  • @DavidO 实际上我有另一个脚本,我正在尝试使用草莓 perl 通过 pmcmd 命令执行 Informatica 工作流,但我无法捕获工作流的失败。我正在使用 if (qx($pmcmd_command)) 其中 $pmcmd_command 具有要执行的实际命令。
  • qx// 返回 STDOUT,但 STDERR 会丢失,除非您将其重定向到某个地方,我不知道如何在 Windows 中执行此操作。如果我是你,我会使用 Capture::Tiny 模块,它使处理 STDOUT、STDERR 和退出代码变得容易且可移植。
猜你喜欢
  • 2012-06-26
  • 2015-11-16
  • 2014-11-20
  • 2017-12-20
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多