Невозможно запустить скрипт Perl из PHP

1

Я сделал perl-скрипт, который я хотел бы запустить с PHP.

Когда я делаю обычный пример вроде

PHP:

exec("perl test.pl",$output);
echo '<pre>'; print_r(array_values($output)); echo '</pre>';

PERL:

#!/usr/bin/perl -s
print "Hiii. This is perl executing in PHP";

И он печатает: Hiii. Это perl выполняется в PHP на PHP

Но когда я добавляю свой другой скрипт Perl (test2):

#!/usr/bin/perl -s

# Function definition
use test_sub qw( :all ) ;

use strict;
use warnings;

if ($ARGV[0] eq "te") 
{
  printf("te chosen to(%d)\n",$ARGV[1]);
  te($ARGV[1]);
}   

И новый PHP выглядит так:

exec("perl test2.pl",$output);
echo '<pre>'; print_r(array_values($output)); echo '</pre>';

Я знаю, что должно быть предупреждение во многих случаях, хотя я не использую никаких аргументов, но ничего не отображается в $ output.

Даже с аргументами в PHP:

exec("perl test2.pl te 1",$output);
echo '<pre>'; print_r(array_values($output)); echo '</pre>';

Ничего не появляется. Я попытался проверить, является ли файл в исполняемом файле функцией

is_executable('test2.pl')

Что это такое.

Это работает на малине PI 2 с Arch, и я не знаю, могло ли это иметь какое-либо влияние?

Другой файл perl, который называется:

package test_sub; 

use strict;
use warnings;

use Exporter qw(import);
use Time::HiRes qw(usleep);

our @EXPORT_OK = qw(te);
our %EXPORT_TAGS = (all => \@EXPORT_OK );

sub te {
  my @var = @_;
  printf("settingup te for %d",$var);
}

Я проверил в терминале для себя, и здесь он работает по назначению. Но я не могу заставить его работать через PHP.

Любая помощь приветствуется.

Обновление 1

Я узнал, что если я добавлю строку:

use test_sub qw( :all ) ;

В скрипт test.pl, который работал, он перестает давать результат.

  • 1
    Почему в вашем Perl-шебанге включен флаг -s ?
Теги:
raspberry-pi

1 ответ

2
Лучший ответ

Здесь есть две проблемы:

Первый:

Ниже строки

printf("settingup te for %d",$var);

следует изменить на

printf("settingup te for %d",@var);

Не было переменной $ var, инициализированной для печати, ее массивом @var, который вы используете в своей подпрограмме.

Во-вторых:

Вы должны знать, как написать простой скрипт php.

#!/usr/bin/php

<?php
exec("perl test.pl te 1",$output);
echo '<pre>'; print_r(array_values($output)); echo '</pre>';
?>

Это отлично работает для меня и выводит:

<pre>Array
(
    [0] => te chosen to(1)
    [1] => settingup te for 1
)
</pre>

perl script:

#!/usr/bin/perl -s

# Function definition
use test_sub qw( :all ) ;

use strict;
use warnings;

if ($ARGV[0] eq "te") 
{
  printf("te chosen to(%d)\n",$ARGV[1]);
  te($ARGV[1]);
}   

perl модуль:

package test_sub; 

use strict;
use warnings;

use Exporter qw(import);
use Time::HiRes qw(usleep);

our @EXPORT_OK = qw(te);
our %EXPORT_TAGS = (all => \@EXPORT_OK );

sub te {
  my @var = @_;
  printf("settingup te for %d",@var);
}

PHP-код:

#!/usr/bin/php

<?php
exec("perl test.pl te 1",$output);
echo '<pre>'; print_r(array_values($output)); echo '</pre>';
?>

Это должно сработать и для вас.

  • 0
    Большое спасибо, это работает для меня сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню