Почему моя Java-программа зависает при вызове из Perl? - PullRequest
0 голосов
/ 01 октября 2009

Внутри скрипта Perl я хочу запустить Java-программу, которая принимает 2 входа, которые будут переданы командной строкой.

Итак, я делаю:

if (scalar @ARGV == 2)
{ print `java myProg $ARGV[0] $ARGV[1]`; } 
elsif (scalar @ARGV == 1) 
{ print `java myProg $ARGV[0]`; } 

Я работаю, если я ввожу 2 аргумента, но все еще зависает, если я ввожу только 1 аргумент

Как мне это исправить?

Кстати, программа на Java работает.


Я изменил свой Perl-скрипт на:

print scalar @ARGV;
print `$ARGV[0]`;
print `$ARGV[1]`;

И если я запускаю 'perl myPerl.pl abc def' в командной строке, он печатает только 2. А не два моих ввода. ПОЧЕМУ!?

Ответы [ 5 ]

7 голосов
/ 01 октября 2009

Чтобы ответить на ваш последний вопрос:

print scalar @ARGV;
print `$ARGV[0]`;
print `$ARGV[1]`;

Приведенный выше код не печатает ожидаемые вами данные, поскольку вы используете обратные метки со случайными входными данными. Perl пытается выполнить команды оболочки «abc» и «def» (в соответствии с вашим примером) и записывает результаты выполнения тех команд, которых нет. Попробуйте напечатать значения напрямую:

print scalar @ARGV;
print $ARGV[0], "\n";
print $ARGV[1], "\n";
3 голосов
/ 01 октября 2009

Java-программа зависает . Попробуйте прямо из командной строки.

Чтобы проверить, достаточно ли аргументов, вы можете сделать:

 die "needs 2 args" unless (scalar @ARGV == 2);

Попробуйте этот код, чтобы доказать, что это Java:

if (scalar @ARGV == 2)
{ 
    print `cat myProg $ARGV[0] $ARGV[1]`; 
} 
elsif (scalar @ARGV==1) 
{ 
    print `cat myProg $ARGV[0]`; 
}

Если все, что вы хотите сделать, это вывести аргументы:

if (scalar @ARGV == 2)
{ 
    print "arguments = [$ARGV[0]] [$ARGV[1]]\n"; 
} 
elsif (scalar @ARGV==1) 
{ 
    print "arguments = [$ARGV[0]]\n"; 
}
2 голосов
/ 01 октября 2009

Второй пример кода движется с рельсов, но первый пример кода выглядит более или менее правильным. Давайте посмотрим на код Java, вашу среду или что-нибудь еще, что может помочь нам понять, почему

{ print `java myProg $ARGV[0] $ARGV[1]`; } 

работает и

{ print `java myProg $ARGV[0]`; }

нет.

0 голосов
/ 02 октября 2009

Попробуйте это:

use strict;
use warnings;

my $BASE_COMMAND = 'java MyProgram';

die "Illegal argument count - must have one or two arguments."
    unless @ARGV == 1 or @ARGV == 2;

# Arrays interpolate into space separated strings (unless you change $" - see perlvar)
my $command = "$BASE_COMMAND @ARGV";

print "Running '$command'\n";
print `$command`;
0 голосов
/ 01 октября 2009

Используйте $#ARGV, чтобы найти индекс последнего элемента массива @ARGV. Добавьте 1 к этому, и вы можете получить количество аргументов.

my $argCount = $#ARGV + 1;
if ($argCount == 1)
{
    die "Please enter 2 arguments!\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...