如何在perl中获取最后执行的命令的值

如何在perl中获取最后执行的命令的值,perl,error-handling,copy,file-copying,strawberry-perl,Perl,Error Handling,Copy,File Copying,Strawberry Perl,我正在尝试执行一个简单的草莓perl脚本进行文件复制,以从最后执行的命令中获取代码。但在所有情况下,我都获得了0/成功 来自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_

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

来自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"; }
由于我在\\test\\test1.csv中使用的路径
D:\\abc\\def\\in\\test\\test1.csv
在计算机上不存在,因此我预计会失败,但无论我提供什么,我都会成功

在执行和输出之后:

D:\pet\common\bin\backup>perl test.pl success D:\pet\common\bin\backup>perl test.pl 成功
如果查看
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

如果查看
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

这是我的第一篇文章,因此请原谅对文章的格式化
copy
失败时返回false/zero(这与
system
)非常感谢David O和ikegami!它解决了这个问题。这是我的第一篇博文,请原谅博文的格式设置
复制
失败时返回false/zero(这不像
系统
),非常感谢David O和ikegami!它解决了这个问题。大多数外部程序也会接受
/
,因为
/
实际上是由Windows本身完全支持的。(Perl不会将
/
转换为
\
;它只是将带有
/
的路径传递给操作系统。)问题通常来自
/
被视为命令行切换的开始,这一问题通常可以通过使用引号来规避。(
dir c:/temp
bad;
dir“c:/temp”
ok)正确:这在
perldoc perlport
at中有记录,尽管您的示例很好,缺少文档。@DavidO实际上我有另一个脚本,我正在尝试使用草莓perl通过pmcmd命令执行Informatica工作流,但我无法捕获工作流的失败。我正在使用if(qx($pmcmd_command)),其中$pmcmd_命令具有要执行的实际命令。
qx/
返回STDOUT,但STDERR会丢失,除非您将其重定向到某个地方,我不知道在Windows中如何执行。如果我是你,我会使用Capture::Tiny模块,它使处理STDOUT、STDERR和退出代码变得简单、可移植。大多数外部程序也会接受
/
,因为
/
实际上完全受Windows本身的支持。(Perl不会将
/
转换为
\
;它只是将带有
/
的路径传递给操作系统。)问题通常来自
/
被视为命令行切换的开始,这一问题通常可以通过使用引号来规避。(
dir c:/temp
bad;
dir“c:/temp”
ok)正确:这在
perldoc perlport
at中有记录,尽管您的示例很好,缺少文档。@DavidO实际上我有另一个脚本,我正在尝试使用草莓perl通过pmcmd命令执行Informatica工作流,但我无法捕获工作流的失败。我正在使用if(qx($pmcmd_command)),其中$pmcmd_命令具有要执行的实际命令。
qx/
返回STDOUT,但STDERR会丢失,除非您将其重定向到某个地方,我不知道在Windows中如何执行。如果我是你,我会使用Capture::Tiny模块,它使处理STDOUT、STDERR和退出代码变得简单、可移植。