Perl - открыть с относительным путем Apache - PullRequest
0 голосов
/ 04 февраля 2020

Недавно мы унаследовали несколько устаревшее приложение perl, и мы работаем над миграцией на новый сервер, а также настройкой среды песочницы, чтобы мы могли начать сортировку приложения. Проблема, с которой мы сталкиваемся, заключается в том, что в настоящее время код использует некоторые относительные пути для метода open. И в настоящее время работает в их среде общего хостинга (у нас мало доступа)

open(HANDLE,"<../relative/path/to/file.txt")

Мы извлекли весь код, пути и т. Д. c. снова и по большей части работайте с приложением, пока мы не запустим один из сценариев, который выполняет вышеизложенное, откроет файл с относительным путем. Тогда это не удается.

Если мы запустим код из командной строки, относительные пути будут работать. Если мы изменим путь на полный путь, он будет работать как через командную строку, так и через Apache (переход на страницу в браузере).

Это заставляет меня думать, что нам нужен какой-то модуль или опция конфигурации установить в Apache, чтобы разрешить сценариям perl доступ или использовать команду open с относительными путями?

Ответы [ 3 ]

2 голосов
/ 04 февраля 2020

Относительные пути относятся к текущему рабочему каталогу процесса, который не обязательно совпадает с каталогом, содержащим программу. Фактически, это часто / для демонов (и, следовательно, их потомков).

Для путей относительно местоположения программы используйте

use FindBin qw( $RealBin );

my $qfn = "$RealBin/relative/path/to/file.txt";
open(my $HANDLE, "<", $qfn)
0 голосов
/ 12 февраля 2020

Как упомянуто в комментарии выше. Наше окончательное решение заключалось в использовании:

File::Basename qw( dirname ); 
chdir(dirname($0));

Это позволило нам заставить код работать, а также сохранило дополнительные модификации кода до минимума.

0 голосов
/ 04 февраля 2020

Неправильно указывать путь к файлу в open с фиксированной строкой, если путь не предопределен и никогда не меняется - как, например, с / etc / fstab в linux ,

Вы должны изменить код, чтобы использовать вместо него переменную (и).

Определение переменной в верхней части скрипта - в функции, если вам нужно изменить base и path , вы будете знать, что вы найдете ее в нескольких первых строках кода.

В такой ситуации добавьте временное в коде что-то вроде

use strict;
use warnings;

open( my $fh, '>', 'my_uniq_file.txt')
    or die 'Couldn\'t open my_uniq_file.txt';

print $fh 'This directory is default base for path location';

close $fh;

Как только вы запустите свой скрипт с веб-сервера, вы должны найти файл my_uniq_tile.txt - это местоположение будет по умолчанию база веб-сервера для расположения файла (ов).

Теперь измените переменные с помощью пути к файлу соответственно.

use strict;
use warnings;

my $dir_project = './project_1/';
my $audio_data = 'audio_data.dat';
my $video_data = 'video_data.dat';
my $descr_data = 'descr_data.dat';

my $qfn = $dir_project . $audio_data;

open(my $fh, '<', $qfn)
    or die "Couldn't open $qfn";

while( <$fh> ) {
     chomp;
    [do something with data]
}

close $fh;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...