Хотя ответ Павла верен, я хотел бы отметить, что был другой способ взглянуть на вашу проблему.Ваш вопрос гласит, что строка заканчивается «ДА» или «НЕТ».Поэтому вы могли бы также разделить строку и напечатать последний элемент, если он соответствует «YES» или «NO»:
perl -lape'$_=$F[-1] if $F[-1]=~m/^(?:YES|NO)$/'
В вашем примере все строки заканчиваются на YES или NO.Если это действительно так для всех строк вашего ввода, это можно упростить до:
perl -lape'$_=$F[-1]'
Краткое объяснение используемых флагов командной строки Perl (вы также можете прочитать это в perldoc perlrun)):
- -l используется для автоматического сжатия строк ввода и добавления «\ n» при печати.
- -a автоматически разбивает строку ввода на пустом месте в @Fмассив, когда используется вместе с "-n" или "-p".
- -p создает цикл, который проходит по строкам указанного входного файла / файлов и выполняет "печать" в конце после вашеговыполняется код.
- -e это, конечно, флаг для выдачи кода в командной строке
Так что в основном флаги командной строки выполняют большую часть работы.Единственное, что мне нужно сделать, это присвоить $ F [-1] (последний элемент строки) в $ _, что будет напечатано благодаря «-p».
Моя цель былане играть в Perl Golf и показать вам более короткий способ ответить на ваш вопрос, вместо этого я пытаюсь указать, что простое размышление о проблеме с несколько иной точки зрения может показать вам разные способы ее решения, которые могут быть лучше /более элегантныйПоэтому, пожалуйста, не сосредотачивайтесь на том, какое решение короче, вместо этого подумайте о том, как разные люди атаковали даже эту простую проблему с разных сторон и как вы можете сделать то же самое.
Еще один момент, вы написали: «Я хочузаменить строки ".Если вы подразумевали замену в самом входном файле, то флаг командной строки "-i" (замена на месте) - ваш друг:
perl -lapi.bak -e'$_=$F[-1]'