Cwd :: abs_path () возвращает undef - PullRequest
0 голосов
/ 24 декабря 2018

У меня проблема с использованием abs_path().Я даю этой функции правильный путь, но в качестве возвращаемого значения я получаю undef.Путь читается из командной строки с использованием следующего кода.

use warnings;
use strict;
use Data::Dumper;
use Cwd qw();

print scalar @ARGV;
print "\n";

print "$ARGV[0]\n";
print "$ARGV[1]\n";
print "$ARGV[2]\n";
my $val = $ARGV[2];
print "$val\n";
my $result = "";
$result = Cwd::abs_path($val);
print "$result\n";

Сценарий Perl выполняется следующим образом:

perl pl_test.pl -results_dir = /home/user123/

Я получаю следующий результат:

3
-results_dir
=
/home/user123/
/home/user123/
Use of uninitialized value in concatenation (.) or string at pl_test.pl line 16.

Я подтвердил с помощью отладчика, что проблема в том, что $ result получает undef в качестве возвращаемого значения из Cwd::abs_path($val);.Я не понимаю, почему это происходит

Один из комментариев побудил меня провести дополнительное тестирование.Я обнаружил, что существует зависимость от конечного слеша следующим образом:

  1. , если каталог не существует: работает без завершающего слеша, возвращает undef сзавершающий слеш.

  2. , если каталог является подкаталогом каталога, который не существует, всегда возвращает undef

  3. , если каталогсуществует, будет работать в обоих случаях, с косой чертой или без нее

1 Ответ

0 голосов
/ 24 декабря 2018

Cwd использует файловую систему, поэтому вы не должны просить ее работать с несуществующими путями.

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

Для работы с именами файлов в целом, для которых файлы не должны существовать, используйте ядро ​​ File :: Spec

perl -MCwd=abs_path -MFile::Spec=rel2abs -wE'
    say abs_path(".");
    say abs_path("./no/such") // "undef";
    say File::Spec->rel2abs("./no/such")
'

Это печатает

/home/my-user-name
undef
/home/my-user-name/no/such

Конечные косые черты не влияют (значимые) операции любого из модулей.

Другой полезный инструмент - Path :: Tiny , с множеством методов для разнообразной работы с существующими и несуществующими путями.

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