use String::ShellQuote qw( shell_quote );
my @cmd = ( "grep", "-oP", '\bInvoked at: \K[^#]*\d', $file_qfn );
my $cmd = shell_quote( @cmd );
my $date = qx($cmd);
die "Can't spawn shell: $!\n" if $? == -1;
die "Shell killed by signal ".( $? & 0x7F )."\n" ) if $? & 0x7F;
die "Shell exited with error ".( $? >> 8 )."\n" ) if $? >> 8;
chomp( $date );
say $date;
更好的是,我们可以避免shell,并且避免构建shell命令。
use IPC::System::Simple qw( capturex );
my @cmd = ( "grep", "-oP", '\bInvoked at: \K[^#]*\d', $file_qfn );
my $date = capturex( @cmd );
chomp( $date );
say $date;
为什么要运行一个子进程呢?
use File::Slurper qw( read_text );
my $file = read_text( $file_qfn );
my ( $date ) = $file =~ /\bInvoked at: ([^#]*\d)/
or die( "Invocation date not found\n" );
say $date;
1条答案
按热度按时间hec6srdp1#
\b
和\d
应该是\\b
和\\d
。qx
文本与qq
文本类似,因此需要对\
、$
和@
进行转义。并且应该去掉print语句中的
\n
,因为$date
中的字符串已经有一个,或者使用chomp( $date );
删除$date
中的一个。您在
$file
的插值中还有一个代码注入错误,可以使用String::ShellQuote的shell_quote
解决。更好的是,我们可以避免shell,并且避免构建shell命令。
为什么要运行一个子进程呢?