perl inline: autosplit не разбивает команду ls на массив @F - PullRequest
0 голосов
/ 12 января 2020
ls | perl -anle 'print $F[0]' -> file1\nfile2\nfile3\n ...

Это печатает все файлы ls. Но это не должно. Я хочу получить доступ к ar @F, а ls дает файл, разделенный пробелом, поэтому каждый файл должен быть одним элементом @F, в соответствии с этим:

-a   turns on autosplit mode when used with a -n or -p.  An implicit
            split command to the @F array is done as the first thing inside the
            implicit while loop produced by the -n or -p.

Так что я бы хотел доступ только к первому элементу, потому что если я изменю на $F[1] в операторе печати, то никакого вывода не произойдет. Я ожидал бы file2. Как тогда работает -a? (да, я прочитал документацию)

Редактировать: Если я использую l, то после конвейера вывод не будет разделен на "\n", поэтому я могу выполнить предыдущую команду с перечислением l .

Ответы [ 2 ]

3 голосов
/ 12 января 2020

Вывод ls отделяется не пробелами, а переводом строки (как если бы использовался -1) при отправке своего вывода на что-то, кроме терминала.

$ ls | cat
bar
foo

(см. В выводе ls есть символы новой строки, но он отображается в одной строке. Почему? для получения дополнительной информации.)

Чтобы заполнить массив каждой строкой ввода, я бы использовал

perl -F\\n -0777ane'...'

или более читаемый

perl -e'chomp(@F=<>); ...'

Например,

$ ls | perl -e'chomp(@F=<>); CORE::say "<$_>" for @F;'
<bar>
<foo>

Оба эти решения обрабатывают пути, содержащие пробелы. (У него есть проблемы только с путями, которые содержат переводы строк.)

Тем не менее, использование ls не совсем подходит. Можно использовать вызов glob для списка файлов еще проще и без каких-либо недостатков.

perl -e'@F=<*>; ...'

Например,

$ perl -e'@F=<*>; CORE::say "<$_>" for @F;'
<bar>
<foo>
1 голос
/ 12 января 2020

Вывод ls отделяется не пробелом, а символами новой строки, когда ls не подключен к tty.

См. Вывод ls имеет переводы строки, но отображается в одной строке. Почему? .

Вместо этого вы можете попробовать:

ls | perl -0777 -ane 'print "$F[0]\n"'

. Это установит разделитель входной записи, чтобы отбросить весь файл, а затем разбить эту строку на пустом месте на @F.

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