Perl однострочно печатает все, кроме последней строки - PullRequest
2 голосов
/ 04 сентября 2011

У меня есть файл.Я хочу напечатать все строки, кроме последней.Как мы можем сделать это с однострочником Perl?

Это не работает:

cat file|perl -lane 'print if not eof()'

Боже мой, это работает.Я не смотрел внимательно на свою продукцию.

seq 1 6 | perl -lane 'print if not eof()'
1
2
3
4
5

Ответы [ 6 ]

14 голосов
/ 04 сентября 2011

Если вам нужно сделать это в командной строке, вы можете использовать команду оболочки head.Отрицательное число строк покажет все, кроме последних N строк.

head --lines=-1 filename

Это расширение GNU, которое не будет работать с головкой BSD, например, со стандартной головкой, поставляемой с OS X.

Для Perl ваш код в основном правильный, но нет необходимости привлекать cat.В противном случае вы читаете файл дважды.Вы можете передать имя файла напрямую.Кроме того, -l фактически ничего не делает, удаляя символ новой строки со входа и возвращая его на выход.Наконец, нет необходимости в -a, так как это расточительно разбивает каждую строку на @F, который не используется.

perl -ne 'print if not eof' filename
6 голосов
/ 04 сентября 2011

Все, что я могу сказать, это ...

Это работает на моем компьютере!

(rimshot!)

Так что именно вы получаете?Это сообщение об ошибке или программа запускается?Распечатывает ли он какие-либо строки?

Существует разница между eof() и eof, которая может вызывать некоторые ваши опасения (хотя оба работают в моей системе).Согласно Perldoc :

eof без аргумента использует последнее чтение файла.Использование eof () с пустыми скобками отличается.Он относится к псевдофайлу, сформированному из файлов, перечисленных в командной строке, и доступ к которым осуществляется через оператор <>.Поскольку <> явно не открывается, как обычный дескриптор файла, eof () перед использованием <> вызовет проверку @ARGV, чтобы определить, доступен ли ввод.Аналогично, функция eof () после <> вернула конец файла, будет предполагать, что вы обрабатываете другой список @ARGV, и, если вы не установили @ARGV, будет читать ввод из STDIN;см. Операторы ввода / вывода в perlop

Кстати, cat не требуется.Это то же самое, и это спасает вас от создания дополнительного процесса:

perl -ne 'print if not eof()' < file

И вы должны быть в состоянии сделать это:

perl -ne 'print if not eof()' file
3 голосов
/ 04 сентября 2011
perl -ne 'print $last;$last=$_' 
3 голосов
/ 04 сентября 2011

Возможно, вы читали это? Объяснение знаменитых однострочников Perl

Они оба работают для меня с Perl 5.10:

cat myfile | perl -ne 'print if not eof'
cat myfile | perl -lane 'print if not eof'

Что не так с поведением, которое вы видите?

1 голос
/ 04 сентября 2011
perl -ne 'print unless eof'

Но почему это должен быть Perl?-

sed '$d'

Варианты игры в гольф:

perl -ne'print if!eof'
sed \$d
0 голосов
/ 04 сентября 2011

Отслеживание @sleeplessnerd:

perl -ne 'BEGIN {$ l = undef}; выведите $ l if (определено $ l);$ l = $ _ 'file.txt

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