Печать текущего каталога с использованием Perl

У меня есть этот код для печати текущего каталога с помощью Perl:

use Cwd qw(abs_path);
my $path = abs_path($0);
print "$path\n";

Но он отображает имя файла моего script вместе с каталогом.

Вот так:

C:\Perl\duration.pl

Я хочу, чтобы он отображал только C:\Perl\.

Как я могу это сделать?

Ответы

Ответ 1

Каждый из следующих фрагментов получает каталог скрипта, который не совпадает с текущим каталогом. Не ясно, какой вы хотите.

use FindBin qw( $RealBin );

say $RealBin;

или

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

say dirname(abs_path($0));

или

use Cwd         qw( abs_path );
use Path::Class qw( file );

say file(abs_path($0))->dir;

Ответ 2

Чтобы получить текущий рабочий каталог (pwd во многих системах), вы можете использовать cwd() вместо abs_path:

use Cwd qw();
my $path = Cwd::cwd();
print "$path\n";

Или abs_path без аргумента:

use Cwd qw();
my $path = Cwd::abs_path();
print "$path\n";

Подробнее см. в документации Cwd.

Чтобы получить каталог, в котором находится ваш Perl файл, извне каталога:

use File::Basename qw();
my ($name, $path, $suffix) = File::Basename::fileparse($0);
print "$path\n";

Для получения дополнительной информации см. документацию File :: Basename.

Ответ 3

Использование:

print($ENV{'PWD'});

Но я думаю, что это не работает в Windows...

Ответ 4

Просто удалите '$ 0'

use Cwd qw(abs_path);
my $path = abs_path();
print "$path\n";

Ответ 5

Вот одно простое решение:

    use Cwd;
    my $cwd = cwd();
    print "Current working directory: '$cwd()'";

Надеюсь, это поможет.

Ответ 6

Вы можете использовать FindBin:

use FindBin '$RealBin';
print "$RealBin\n";

FindBin - стандартный модуль, который устанавливается при установке Perl. Чтобы получить список стандартных прагматик и модулей, см. perldoc perlmodlib.

Ответ 7

Я использовал мой script в каталогах с символическими ссылками. script анализирует путь и выполняет команды в зависимости от пути. Я столкнулся с правильным определением текущего пути.

Вот пример:

[email protected] apache # pwd
/services/apache

[email protected] apache # readlink -f .
/services/apache2225

Путь раскрытия модуля Cwd (аналог readlink -f) http://perldoc.perl.org/Cwd.html

[email protected] apache # perl -e 'use Cwd; print cwd . "\n";'
/services/apache2225

Если вам нужно получить текущий путь, например pwd, вы можете использовать $ENV {'PWD'}

[email protected] apache # perl -e 'use Cwd; print $ENV{'PWD'}."\n";'
/services/apache

Спасибо.