Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > получить имя/путь скрипта в самом себе


Автор: _hunter 9.1.2008, 20:16
Добрый день...

Можно ли как-то в скрипте узнать путь к себе? Т.е. нужно что-то типа сишного argv[0] (как я понимаю перловский @ARGV содержит именно параметры командной строки).

С уважением...

Автор: KSURi 9.1.2008, 20:43
Код

$0


Добавлено @ 20:47
Или для точности 
Код

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

Автор: nitr 10.1.2008, 03:37
Это уже обсуждалось на форуме, к сожалению $0 не всегда даёт ожидаемый результат. Так что, KSURi, правильно поправился

Вот почему:
1.pl
Код
#!perl
print $0

Цитата
c:\>1.pl
c:\1.pl
c:\>perl 1.pl
1.pl
c:\>



Чтобы было верно smile
1.pl
Код
#!perl
use Cwd 'abs_path';
print abs_path($0)

Цитата
c:\>1.pl
c:\1.pl
c:\>perl 1.pl
C:\1.pl
c:\>


В переменной $0 содержится имя скрипта и путь его вызова. Чтобы получить потом только путь, то надо обработать переменную.
К примеру, создать регесп, но зачем мучится.
В базовом модуле Cwd , есть функция cwd, это можно сказать юниксовая pwd, но для получения "валидного" пути в Windows, надо использовать
Код
#!perl
use Cwd 'getdcwd';

print getdcwd

Даже abs_path выводит "невалидный" для Windows путь.
Цитата
c:\a\b\c>1.pl
c:/a/b/c/1.pl

c:\a\b\c>


Имхо, надо примерно так, возможно есть иное решение ;)
Код
#!perl
use Cwd;

my $dir = ($^O =~ /win/i) ? getdcwd : getcwd;
print $dir;




Автор: AlexPet 10.1.2008, 09:42
Я всегда использовал для получения пути модуль FindBin:
Код

use FindBin qw($Bin);
print "$Bin\n";

Автор: nitr 10.1.2008, 10:03
AlexPet, если глянуть на исходник этого модуля, то вот что можно увидеть:
Код
     # Get absolute paths to directories
     if ($Bin) {
      my $BinOld = $Bin;
      $Bin = abs_path($Bin);


так что... ;)

Да и у вас тоже надо регеспом "модифицировать" эту переменную:
Цитата
c:\a\b\c>1.pl
c:/a/b/c
c:\a\b\c>

Автор: AlexPet 10.1.2008, 11:53
nitr, да, точно.
Никогда не обращал внимание на косые черты в win32 

Автор: KSURi 10.1.2008, 16:22
В принципе nitr прав, но фатального ничего не случится, если вы не исправите слэши, т.к. Windows воспринимает оба варианта:
Код

C:\>cd /Users

C:\Users>cd .\KSURi

C:\Users\KSURi>

Автор: nitr 10.1.2008, 20:12
Цитата(KSURi @  10.1.2008,  16:22 Найти цитируемый пост)
 т.к. Windows воспринимает оба варианта:

Она понимает как-то "кривовато" ;)
Цитата
c:\a\b\c>d:

D:\>cd c:/a/b/c
Системе не удается найти указанный путь.

D:\>


она иначе воспринимает, можно найти конечно документацию, но стоит ли?
Цитата
C:\a\b\c>
C:\a\b\c>cd c:/

C:\a\b\c>cd c:\

C:\>cd /a/b/c

C:\a\b\c>

Цитата
C:\a\b\c>cd c:\

C:\>cd c:\a\b\c

C:\a\b\c>cd c:\

C:\>cd c:/a/b/c

C:\a\b\c>

отличия при работе с разными дисками smile

Автор: KSURi 11.1.2008, 02:10
Я совсем забыл, что у меня Vista)

Цитата(nitr @  10.1.2008,  20:12 Найти цитируемый пост)
C:\a\b\c>
C:\a\b\c>cd c:/ # остались на месте

C:\a\b\c>cd c:\

C:\>cd /a/b/c

C:\a\b\c>


а у меня:
Код

D:\a\b\c>cd D:/ # переместились в корень

D:\>cd a/b/c

D:\a\b\c>cd D:\

D:\>cd a\b\c

D:\a\b\c>


Оказывается в Vista немного не так, как в XP. Раньше не замечал

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)