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

perl -pi -e 's,vaadin-element,color-picker,g' *.* demo/* test/* src/* theme/*/*
(следуя этому документу)

К сожалению, кажется, что у окна распределения перла, которое я использую, есть некоторые проблемы с командой, поскольку я получаю следующую ошибку:

Can't open *.*: Invalid argument.
Can't open demo/*: Invalid argument.
Can't open test/*: Invalid argument.
Can't open src/*: Invalid argument.
Can't open theme/*/*: Invalid argument.

Любые предложения о том, как это исправить? Заранее спасибо!

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

0
JDC 29 Май 2019 в 10:00

2 ответа

Лучший ответ

В системах Unix оболочка расширяет глобусы и передает имена файлов в программу.

$ perl -e'CORE::say for @ARGV' *
file1
file2

Оболочка Windows, с другой стороны, передает значения как есть и оставляет на усмотрение программы их обрабатывать как глобусы, если это необходимо.

>perl -e"CORE::say for @ARGV" *
*

Вы можете выполнить сглаживание следующим образом:

>perl -MFile::DosGlob=glob -e"BEGIN { @ARGV = map glob, @ARGV } CORE::say for @ARGV" *
file1
file2

Блок BEGIN, как правило, не требуется, но он будет обеспечивать сглаживание один раз и достаточно рано при использовании -n (что подразумевается -p).

-MFile::DosGlob=glob делает glob семантикой, подобной Windows. Например, он вызывает *.* для сопоставления всех файлов, даже если они не содержат ..

Интегрированное :

perl -i -MFile::DosGlob=glob -pe"BEGIN { @ARGV = map glob, @ARGV } s,vaadin-element,color-picker,g" *.* demo/* test/* src/* theme/*/*
5
ikegami 31 Май 2019 в 03:50

В операционных системах на основе Unix оболочка расширяет глобусы, такие как *.*, и предоставляет командную строку в виде массива строк для программы.

В Windows командная строка представляет собой одну строку, и программа должна интерпретировать, что это означает, включая такие вещи, как символы кавычек и глобусы. Если это обычная программа на C, среда выполнения C интерпретирует командную строку, расширяет глобусы и передает массив строк в main. Это потому, что стандарт С требует этого.

Однако Perl не является C. Используйте библиотеку File::Glob для расширения аргументов.

1
Ben 29 Май 2019 в 07:10