Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl命令行问题_Perl_Command Line_Command Line Arguments_Command Prompt - Fatal编程技术网

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

我正在编写一个Perl程序,它将接受一些命令行参数(它们实际上由另一个程序提供),并打开一个特定页面的pdf。我根据(见第5页)。我已经直接从命令行测试了该命令,它完全符合我的要求。现在我正试图从Perl中实现它,但它似乎不起作用。我得到的错误是:

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的知识。。。谢谢我(显然)不知道。