Программисту понадобилось быстренько отфильтровать и переформатировать один лог. Исходный файл содержит по одной json-записи в строке, в итоге должен получиться tab separated файл из двух колонок.
Источник данных ненадежный, в прошлый раз в логах попадались буквы вместо цифр, поэтому программист подстраховался eval
-ом и валидацией.
Получился такой скрипт:
Все хорошо? Нет! На выходе некоторые строчки пустые, а некоторые содержат только одно значение вместо положенных двух.
Пример подозрительного результата:
Но как? Ведь там же валидация…
А вот пример подозрительных данных:
Но как эти данные проходят проверку?
Проблема в том, что доллар $
в регулярных выражениях матчится либо в конце строки,
либо перед символом \n
в конце строки.
К примеру, строка "123\n"
успешно сопоставляется с регулярным выражением /^[0-9]+$/
.
Чтобы в регулярном выражении поймать настоящий конец строки, стоит использовать \z
:
Также см. perldoc perlre (раздел Assertions).