Как я получаю полный путь к сценарию Perl, который выполняется?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

163
задан serenesat 18 February 2015 в 12:18
поделиться

11 ответов

Существует несколько путей:

  • $0 в настоящее время выполняющийся сценарий в соответствии с POSIX, относительно текущего рабочего каталога, если сценарий в или ниже CWD
  • Кроме того, cwd(), getcwd() и abs_path() обеспечиваются Cwd модуль и говорит Вам, откуда скрипт запускается
  • Модуль FindBin обеспечивает $Bin & $RealBin переменные, которые обычно являются путем к выполняющемуся сценарию; этот модуль также обеспечивает $Script & $RealScript это - название сценария
  • __FILE__ фактический файл, что интерпретатор Perl имеет дело с во время компиляции, включая ее полный путь.

Я видел первые три ($0, Cwd модуль и FindBin модуль), перестали работать под mod_perl эффектно, производя бесполезный вывод такой как '.' или пустая строка. В таких средах я использую __FILE__ и получите путь от того использования File::Basename модуль:

use File::Basename;
my $dirname = dirname(__FILE__);
240
ответ дан SamB 23 November 2019 в 21:16
поделиться

На *отклоняют, у Вас, вероятно, есть команда "whereis", которая ищет Ваш $PATH, ища двоичный файл с именем. Если 0$ не содержат имя полного пути, работание whereis $scriptname и сохранение результата в переменную должны сказать Вам, где сценарий расположен.

-5
ответ дан foxxtrot 23 November 2019 в 21:16
поделиться

Имейте Вас попробованный:

$ENV{'SCRIPT_NAME'}

или

use FindBin '$Bin';
print "The script is located in $Bin.\n";

Это действительно зависит от того, как это называют и если это - CGI или выполняемый от нормальной оболочки, и т.д.

6
ответ дан Sean 23 November 2019 в 21:16
поделиться
Use File::Spec;
File::Spec->rel2abs( __FILE__ );

http://perldoc.perl.org/File/Spec/Unix.html

35
ответ дан the Tin Man 23 November 2019 в 21:16
поделиться

perlfaq8 отвечает на очень похожий вопрос с использованием rel2abs() функция на $0. Та функция может быть найдена в File::Spec.

2
ответ дан the Tin Man 23 November 2019 в 21:16
поделиться

Некоторый короткий фон:

К сожалению, Unix API не предоставляет под управлением программе полный путь к исполняемому файлу. На самом деле программа, выполняющая Ваш, может обеспечить то, что она хочет в поле, которое обычно говорит Вашу программу, каково это. Существуют, как все ответы указывают, различная эвристика для нахождения вероятных кандидатов. Но не что иное как поиск всей файловой системы будет всегда работать, и даже который перестанет работать, если исполняемый файл будет перемещен или удален.

Но Вы не хотите исполняемый файл Perl, который является тем, что на самом деле работает, но сценарий, который он выполняет. И Perl должен знать, где сценарий должен найти его. Это хранит это в __FILE__, в то время как $0 от Unix API. Это может все еще быть относительным путем, поэтому взять предложение Mark's и канонизировать его с File::Spec->rel2abs( __FILE__ );

7
ответ дан the Tin Man 23 November 2019 в 21:16
поделиться

Вы могли использовать FindBin, Cwd, File::Basename или комбинацию их. Они - все в основном распределении Perl IIRC.

Я использовал Cwd в прошлом:

Cwd:

use Cwd qw(abs_path);
my $path = abs_path($0);
print "$path\n";
11
ответ дан brian d foy 23 November 2019 в 21:16
поделиться

Я думаю модуль, который Вы ищете, FindBin:

#!/usr/bin/perl
use FindBin;

$0 = "stealth";
print "The actual path to this is: $FindBin::Bin/$FindBin::Script\n";
16
ответ дан bmdhacks 23 November 2019 в 21:16
поделиться

0$ обычно являются названием Вашей программы, таким образом, как насчет этого?

use Cwd 'abs_path';
print abs_path($0);

Кажется мне, что это должно работать, как abs_path знает, используете ли Вы относительный или полный путь.

Обновление Для любого читающего это несколько лет спустя, необходимо прочитать ответ Drew. Это намного лучше, чем мой.

144
ответ дан cxw 23 November 2019 в 21:16
поделиться

Получение полного пути к $0 или __FILE__ то, что Вы хотите. Единственная проблема состоит в том, если кто-то сделал a chdir() и $0 было относительно - затем необходимо получить полный путь в a BEGIN{} предотвратить любые неожиданности.

FindBin попытки пойти один лучше и унизиться вокруг в $PATH для чего-то соответствующего basename($0), но существуют времена, когда это делает слишком удивительные вещи (конкретно: когда файл "прямо перед Вами" в cwd.)

File::Fu имеет File::Fu->program_name и File::Fu->program_dir для этого.

9
ответ дан the Tin Man 23 November 2019 в 21:16
поделиться

В Windows с помощью dirname и abs_path вместе работал лучше всего на меня.

use File::Basename;
use Cwd qw(abs_path);

# absolute path of the directory containing the executing script
my $abs_dirname = dirname(abs_path([110]));
print "\ndirname(abs_path(\[110])) -> $abs_dirname\n";

вот то, почему:

# this gives the answer I want in relative path form, not absolute
my $rel_dirname = dirname(__FILE__); 
print "dirname(__FILE__) -> $rel_dirname\n"; 

# this gives the slightly wrong answer, but in the form I want 
my $full_filepath = abs_path([111]);
print "abs_path(\[111]) -> $full_filepath\n";
0
ответ дан 23 November 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: