Perl chdir не работает с шаблоном glob

Я пытаюсь сделать компакт-диск в моем Perl-скрипте. Я использую следующую команду:

chdir "/home/test/test1/test2/perl*";

Значение perl* на самом деле равно perl_0122_2044, но это значение может отличаться.

Приведенная выше команда chdir не выполняет cd пути. Я делаю что-то неправильно?


person Paul IT    schedule 11.08.2020    source источник
comment
Откуда ты знаешь, что это не так? Что вы ожидаете?   -  person simbabque    schedule 11.08.2020
comment
Я не вижу никакой ошибки при проверке. Вы используете прагму autodie? Откуда ты знаешь, что он не работает?   -  person Shawn    schedule 11.08.2020
comment
Ниже приведены полные команды: chdir /home/test/test1/test2/perl*; исполнительный кот test.in | сборка grep | awk '{печать \$2}'; После выполнения скрипта появляется ошибка: cat: test.in: Нет такого файла или каталога   -  person Paul IT    schedule 11.08.2020
comment
Вы должны указать это в своем вопросе, а не в комментарии.   -  person Shawn    schedule 11.08.2020


Ответы (3)


chdir не принимает * и другие символы расширения в аргументе. Используйте для этого glob или что-то подобное, чтобы извлечь один каталог, затем chdir в него. Например, это меняет каталог на первый найденный /home/test/test1/test2/perl*:

$dir = (glob "/home/test/test1/test2/perl*")[0];
# only change dir if any dir was found: 
if (-d $dir) {
    # fail if cannot change dir (or, even better, use autodie):
    chdir $dir or die "Could not change to $dir: $!";
}
person Timur Shtatland    schedule 11.08.2020
comment
И проверьте эту ошибку, в основном, чтобы увидеть каталог, который она пробовала: chdir $dir or die "Could not change to $dir: $!"; - person brian d foy; 11.08.2020
comment
@briandfoy Спасибо за напоминание, добавил это и один дополнительный чек! - person Timur Shtatland; 11.08.2020

chdir ожидает путь, а не подстановочный знак. Используйте glob, чтобы расширить подстановочный знак:

my ($dir) = glob "/home/test/test1/test2/perl*";
chdir $dir or die "$dir: $!";

Если расширений несколько, будет использовано первое.

person choroba    schedule 11.08.2020

Аналогичным образом glob обрабатывается модулем в raku https://modules.raku.org/dist/IO::Glob

person p6steve    schedule 12.08.2020