Если Perl сообщает, что не может найти файл, значит, он не может найти файл. И проблема больше в вашем коде. Посмотрите на этот пример.
sidburn@sid:~/perl$ cat test.pl
#!/usr/bin/env perl
use strict;
use warnings;
use xyz;
sidburn@sid:~/perl$ cat test2.pl
#!/usr/bin/env perl
use strict;
use warnings;
system('test.pl');
sidburn@sid:~/perl$ cat test3.pl
#!/usr/bin/env perl
use strict;
use warnings;
system('./test.pl');
Если вы выполните test2.pl, вы получите:
sidburn@sid:~/perl$ ./test2.pl
Can't exec "test.pl": No such file or directory at ./test2.pl line 4.
Если вы выполните test3.pl, вы получите:
sidburn@sid:~/perl$ ./test3.pl
Can't locate xyz.pm in @INC (@INC contains: /home/sidburn/perl510/lib/5.10.1/i686-linux /home/sidburn/perl510/lib/5.10.1 /home/sidburn/perl510/lib/site_perl/5.10.1/i686-linux /home/sidburn/perl510/lib/site_perl/5.10.1 .) at ./test.pl line 4.
BEGIN failed--compilation aborted at ./test.pl line 4.
Если вы не указали относительный или абсолютный путь, тогда выполните perl-поиск команды в переменной окружения $ PATH. Если его там нет, он не может найти файл.
Вам необходимо указать «./», если он находится в текущем каталоге. Но обратите внимание, что «текущий каталог» не означает каталог, к которому относится ваш скрипт.
Если вы хотите позже, вы, вероятно, захотите сделать
use FindBin;
с этим вы можете сделать что-то вроде этого:
#!/usr/bin/env perl
use strict;
use warnings;
use FindBin;
use File::Spec::Functions;
my $exe = catfile($FindBin::RealBin, 'test.pl');
print $exe, "\n";
system($exe);
Если вы хотите проверить, правильно ли возвращается система, вам нужно проверить возвращаемое значение из команды system () или $? позже это содержит значение.
if ( $? != 0 ) {
die "Cannot execute $exe.\n";
}
если вы хотите подавить сообщения из вашей программы, вам нужно перенаправить STDOUT, STDERR перед запуском вашей программы с помощью system ().
Или используйте что-то вроде IPC :: System :: Simple
Или IPC :: Open3 (в основном).