use strict;
use warnings;
use feature 'say';
use Cwd qw/abs_path getcwd/;
use File::HomeDir;
my $path = 'foo/../bar';
if($path =~ /^~/) {
my $home = File::HomeDir->my_home;
$path =~ s/^~/$home/;
}
if($path !~ m!^/!) {
$path = getcwd . "/$path";
}
my $full_path = abs_path($path);
if(defined $full_path && -d $full_path) {
say "$full_path exists";
} else {
say "$path is non-existant";
}
File::Homedir
позволит получить каталог домашних пользователей, и вы можете заменить тильды в пути.
Если путь в этой точке не начинается с /
(является относительным путем), добавьте текущий рабочий каталог с getcwd
, чтобы получить абсолютный путь.
После того, как вы это сделали, вы можете передать его через abs_path
, чтобы разрешить такие вещи, как .
и ..
, а также символические ссылки.
Наконец, вы можете проверить это с помощью -d
, чтобы узнать, существует ли результирующий путь.
Просто некоторая терминология, которая может упростить поиск: то, что вы называете «корневым путем», обычно называется абсолютным путем, а «путь без корня» называется относительным путем. – ThisSuitIsBlackNot
Абсолютный путь - это тот, который после расширения тильды начинается с косой черты. Вы можете использовать ярлык, ища тильду или косую черту, и обрабатывать недействительные расширения тильды отдельно позже в коде. – tripleee
@tripleee Осторожно о тильде, не все программы интерпретируют ее как значение $ HOME. Попробуйте 'perl -MFile :: Find -e 'find (sub {print" $ File :: Find :: name \ n ";}," ~ ");'' --- ничего не печатает, но, очевидно, у меня есть файлов в '~'. – Robert