Perl命令行问题
我正在编写一个Perl程序,它将接受一些命令行参数(它们实际上由另一个程序提供),并打开一个特定页面的pdf。我根据(见第5页)。我已经直接从命令行测试了该命令,它完全符合我的要求。现在我正试图从Perl中实现它,但它似乎不起作用。我得到的错误是:Perl命令行问题,perl,command-line,command-line-arguments,command-prompt,Perl,Command Line,Command Line Arguments,Command Prompt,我正在编写一个Perl程序,它将接受一些命令行参数(它们实际上由另一个程序提供),并打开一个特定页面的pdf。我根据(见第5页)。我已经直接从命令行测试了该命令,它完全符合我的要求。现在我正试图从Perl中实现它,但它似乎不起作用。我得到的错误是: The process tried to write to a nonexistent pipe 这是密码。。。有人能告诉我我做错了什么吗 #!C:/perl/bin/perl use strict; use warnings; use diagn
The process tried to write to a nonexistent pipe
这是密码。。。有人能告诉我我做错了什么吗
#!C:/perl/bin/perl
use strict;
use warnings;
use diagnostics;
my $c = `cmd \c "`.$ARGV[0].`" /A "page=`.$ARGV[1].`=OpenActions" "`.$ARGV[2].``;
print $c;
system "Pause";
在这之后我得到的只是cmd中的一个空白。一旦我按下Ctrl+C键,它就会返回一个提示,如果我在那里按下enter键,就会出现上面的错误。我想你对反勾号的工作原理有点困惑。大概是这样的:
my $c = `/where_is/pancake_house`
my $c = `cmd \\c "$ARGV[0]" /A "page=$ARGV[1]=OpenActions" "$ARGV[2]`;
my $c = qx{cmd \c "}.$ARGV[0].qx{" /A "page=}.
$ARGV[1].qx{=OpenActions" "}.$ARGV[2].qx{};
将运行/where_is/pancake_house
命令,并将标准输出上打印的内容放入$c
。反勾号也像双引号字符串一样插入。你还必须避开反斜杠
所以,您不需要在命令中使用多组反勾号,也不需要像这样将内容粘贴在一起。大概是这样的:
my $c = `/where_is/pancake_house`
my $c = `cmd \\c "$ARGV[0]" /A "page=$ARGV[1]=OpenActions" "$ARGV[2]`;
my $c = qx{cmd \c "}.$ARGV[0].qx{" /A "page=}.
$ARGV[1].qx{=OpenActions" "}.$ARGV[2].qx{};
应该没问题。当然,如果
ARGV
值包含空格、引号或其他有趣的内容,您仍然会遇到问题。您可能希望使用或更安全。我想您对反勾号的工作原理有点困惑。大概是这样的:
my $c = `/where_is/pancake_house`
my $c = `cmd \\c "$ARGV[0]" /A "page=$ARGV[1]=OpenActions" "$ARGV[2]`;
my $c = qx{cmd \c "}.$ARGV[0].qx{" /A "page=}.
$ARGV[1].qx{=OpenActions" "}.$ARGV[2].qx{};
将运行/where_is/pancake_house
命令,并将标准输出上打印的内容放入$c
。反勾号也像双引号字符串一样插入。你还必须避开反斜杠
所以,您不需要在命令中使用多组反勾号,也不需要像这样将内容粘贴在一起。大概是这样的:
my $c = `/where_is/pancake_house`
my $c = `cmd \\c "$ARGV[0]" /A "page=$ARGV[1]=OpenActions" "$ARGV[2]`;
my $c = qx{cmd \c "}.$ARGV[0].qx{" /A "page=}.
$ARGV[1].qx{=OpenActions" "}.$ARGV[2].qx{};
应该没问题。当然,如果ARGV
值包含空格、引号或其他有趣的内容,您仍然会遇到问题。您可能希望使用或来提高安全性。当Perl看到
my $c = `cmd \c "`.$ARGV[0].`" /A "page=`.$ARGV[1].`=OpenActions" "`.$ARGV[2].``;
它把它变成这样:
my $c = `/where_is/pancake_house`
my $c = `cmd \\c "$ARGV[0]" /A "page=$ARGV[1]=OpenActions" "$ARGV[2]`;
my $c = qx{cmd \c "}.$ARGV[0].qx{" /A "page=}.
$ARGV[1].qx{=OpenActions" "}.$ARGV[2].qx{};
这些qx{…}
部分中的每一部分在遇到时都由命令shell执行,其中大多数可能是语法错误。您的完整命令永远不会运行
你可能想要的是:
my $c = qx{cmd \\c "$ARGV[0]" /A "page=$ARGV[1]=OpenActions" "$ARGV[2]"};
它构造字符串,然后将其传递给shell。当Perl看到
my $c = `cmd \c "`.$ARGV[0].`" /A "page=`.$ARGV[1].`=OpenActions" "`.$ARGV[2].``;
它把它变成这样:
my $c = `/where_is/pancake_house`
my $c = `cmd \\c "$ARGV[0]" /A "page=$ARGV[1]=OpenActions" "$ARGV[2]`;
my $c = qx{cmd \c "}.$ARGV[0].qx{" /A "page=}.
$ARGV[1].qx{=OpenActions" "}.$ARGV[2].qx{};
这些qx{…}
部分中的每一部分在遇到时都由命令shell执行,其中大多数可能是语法错误。您的完整命令永远不会运行
你可能想要的是:
my $c = qx{cmd \\c "$ARGV[0]" /A "page=$ARGV[1]=OpenActions" "$ARGV[2]"};
它构造字符串,然后将其传递给shell。Backtick不像您想象的那样工作
$var = "foo";
`cmd \c `.$foo
这不会执行命令
cmd\c foo
。它执行命令cmd\c
并获取输出,将$foo
的值连接到该输出。您需要构造整个命令,然后将其提供给backtick操作符。backtick不像您想象的那样工作
$var = "foo";
`cmd \c `.$foo
这不会执行命令
cmd\c foo
。它执行命令cmd\c
并获取输出,将$foo
的值连接到该输出。您需要构造整个命令,然后将其提供给backtick操作符。在组装命令字符串时是否使用backtick(`)而不是单引号(')?是的,我使用backtick。反勾号在tab键上方,对吗?顺便问一下,cmd\c应该是什么?如果不是cmd/cYeah,Ingo,谢谢。这实际上清除了程序。在汇编命令字符串时,是否使用反勾号(`)而不是单引号(')?是的,我使用反勾号。反勾号在tab键上方,对吗?顺便问一下,cmd\c应该是什么?如果不是cmd/cYeah,Ingo,谢谢。这实际上清除了程序。我尝试添加你说的内容,但它仍然返回相同的错误。不过谢谢你的努力。(是的,它被复制和粘贴)我尝试添加您所说的内容,但它仍然返回相同的错误。不过谢谢你的努力。(是的,它被复制和粘贴)谢谢,这清除了反勾号。但是,我不想这么说,情况没有改变。它仍然做着和以前一样的事情…最后,即使有Ingo的回答,我原来的程序的命令也不起作用,所以我求助于这个。这就是为什么答案是这样的。谢谢,这就解决了倒勾问题。但是,我不想这么说,情况没有改变。它仍然做着和以前一样的事情…最后,即使有Ingo的回答,我原来的程序的命令也不起作用,所以我求助于这个。这就是为什么答案是这样的。这也教会了我更多关于Perl。。。谢谢我不知道(很明显)。这也教会了我更多关于Perl的知识。。。谢谢我(显然)不知道。