Как я могу вернуть значение из Perl-программы в скрипт Korn-shell? - PullRequest
3 голосов
/ 10 мая 2010

Я хочу сделать это в сценарии оболочки:

#!/usr/bin/ksh

PERL_PATH=/usr/local/bin/perl

RET1=$(${PERL_PATH} missing_months_wrap.pl)

echo $RET1

Как мне это сделать?

вызов сценария perl, как описано выше, вызывает ошибку:

> shell.sh
Can't return outside a subroutine at missing_months_wrap.pl line 269.

РЕДАКТИРОВАТЬ: внутри скрипта Perl операторы:

unless (@pm1_CS_missing_months)
{
$SETFLAG=1;
}

my @tmp_field_validation = `sqlplus -s $connstr \@DLfields_validation.sql`;

unless (@tmp_field_validation)
{
$SETFLAG=1;
}

if ($SETFLAG==1)
{
return $SETFLAG;
}

Ответы [ 3 ]

2 голосов
/ 10 мая 2010

Сценарий оболочки может получить состояние выхода из сценария Perl в $? переменная или вывод сценария Perl, если он вызывается с помощью обратных кавычек или подоболочки.

perl test.pl
VAR=$?

Обязательно получите $? значение сразу после вызова сценария Perl, так как оно может измениться.

VAR=`perl test.pl`

или VAR = $ (perl test.pl)

Во втором методе переменная может быть строкой, а в первом - целым числом от 0 до 255.

2 голосов
/ 10 мая 2010

Вам потребуется изменить ваш Perl-скрипт, чтобы он выводил нужное вам значение (в стандартный поток вывода), и затем вы можете использовать это значение в своем скрипте оболочки.

1 голос
/ 10 мая 2010

Назначение RET1 в вашем сценарии оболочки запускает команду Perl и записывает ее стандартный вывод. Чтобы заставить вашу Perl-программу идти вперед, измените условное выражение в конце на

if ($SETFLAG==1)
{
  print $SETFLAG;
}

Запуск это производит

1

Другой способ - использовать состояние выхода из программы Perl. С shell.sh, содержащим

#! /usr/bin/ksh
RET1=$(${PERL_PATH} missing_months_wrap.pl)
echo $?

и изменение последнего условия в missing_months_wrap.pl на

if ($SETFLAG==1)
{
  exit $SETFLAG;
}

вы получите тот же вывод:

$ PERL_PATH=/usr/bin/perl ./shell.sh 
1
...