Как я могу заставить Perl распознавать пути с помощью '~'? - PullRequest
5 голосов
/ 28 октября 2010

Возможен дубликат:
Как найти домашний каталог пользователя в Perl?

Я использую Ubuntu.

Всякий раз, когда я передаю скрипту Perl путь, начинающийся с ~ (например, ~/Documents/file.txt), он не находит его. Я должен пройти канонический путь (например, /home/dave/Documents/file.txt).

Почему это?

Можно ли заставить Perl распознавать ~ путей?

UPDATE

Все предлагаемые решения включают изменение кода в скриптах. Я хотел бы найти решение, которое бы не включало какие-либо изменения в самих скриптах (поскольку не все они мои). Возможно, что-то работает в Bash?

Обновленная версия вопроса была размещена на Super User .

Ответы [ 6 ]

7 голосов
/ 28 октября 2010

Вы можете передать путь к glob, чтобы расширить его.

6 голосов
/ 28 октября 2010

Для надежного (и простого) кроссплатформенного метода попробуйте File :: HomeDir :

use File::HomeDir;
print File::HomeDir->my_home;
5 голосов
/ 28 октября 2010

Функция glob понимает стандартную глобализацию файлов Unix.

my $file = glob('~/Documents/file.txt');
3 голосов
/ 28 октября 2010

Из комментария Бруно вы можете сделать это следующим образом:

$path =~ s/^~(\w*)/ ( getpwnam( $1 || $ENV{USER} ))[7] /e;

Флаг e заменяет выражение на результат из , выполняющий или вычисление выражение замены.

3 голосов
/ 28 октября 2010

Используйте угловые кавычки, а не двойные кавычки:

open(my $fh, "< :crlf :encoding(cp1252)",
              <~/Documents/file.txt>)
    || die "couldn't open Winblose text file ~/Documents/file.txt: $!";

Итерационный оператор <xxx>, который люди обычно считают синтаксическим сахаром для функции readline, вместо этого вызывает globфункционирует, если в xxx есть метачары оболочки, и тильда считается одним из них.

Вы можете предпочесть открытый режим <:encoding(Latin1).Это зависит только от файла.

1 голос
/ 28 октября 2010

Попробуйте заменить ~ на $ENV{HOME}

...