Попробуйте это:
my @args = ('C:/Program Files (x86)/Adobe/Reader 10.0/Reader/AcroRd32.exe');
if (system(@args) != 0) {
# Can't run acroread. Oh Noes!!!
die "Unable to launch acrobat reader!\n";
}
Суть system () состоит в том, что она выполняет две разные функции в зависимости от числа и типа (аргументов), которые она получает.Если аргумент является массивом или если имеется несколько аргументов, Perl предполагает, что первая - это программа, запускаемая с остальными в качестве аргументов, и запускает саму программу.
Если, однако, это всего лишь одна строка, Perlобрабатывает это по-другому.Он запускает ваш интерпретатор командной строки (обычно CMD.EXE в Windows) в строке и позволяет ему делать то, что он хочет с ним.Это становится проблематичным довольно быстро.
Во-первых, и Perl, и оболочка выполняют различные виды интерполяции строки (например, заменяют '//' на '/', разбивают на символы пробел и т. Д.), И это оченьлегко потерять след того, что делает что.Я нисколько не удивлен, что ваша команда не работает - есть так много вещей, которые могут пойти не так.
Во-вторых, трудно точно знать, какая оболочка действительно запускается в Windows или чтоизменения, которые Perl вносит в него в первую очередь.В Unix это обычно не имеет значения - каждая оболочка делает более или менее то же самое с помощью простых команд.Но в Windows вы могли бы запустить raw CMD.EXE, GNU Bash или какую-нибудь промежуточную программу, которая обеспечивает поведение, похожее на оболочку Unix.А поскольку существует несколько различных портов Perl для Windows, он вполне может измениться, если вы переключитесь.
Но если вы используете форму массива, все останется в Perl и больше ничего не произойдет.
Кстати, документация для system () и $? здесь и здесь .Это стоит прочитать.