в списочном контексте

Уже встречавшийся нам оператор изменяет свое поведение в списочном контексте. Как говорилось ранее, в скалярном контексте возвращает первую строку входных данных. В списочном контексте он возвращает все оставшиеся строки до конца файла. Каждая строка возвращается в отдельном элементе списка. Пример:

@lines = ; # Чтение стандартного ввода в списочном контексте

Если данные поступают из файла, читает весь файл до конца. Но что происходит при вводе с клавиатуры? В UNIX и ряде других систем, включая Linux и Mac OS X, пользователь обычно нажимает клавиши ControlQD1; этот символ не воспринимается Perl2, хотя он и может отображаться на экране. В системах DOS/Windows используется комбинация ControlQZ.3 Если в вашей системе используются другие сочетания клавиш, обратитесь к документации или узнайте у местного специалиста. Если пользователь, запустивший программу, ввел три строки, а затем нажал клавиши, обозначающие конец файла, полученный массив будет состоять из трех элементов. Каждый элемент будет содержать строку, завершающуюся символом новой строки.

А представьте, как удобно было бы устранить все эти символы новой строки одним вызовом chomp! Оказывается, если передать chomp массив со списком строк, функция удалит завершающий символ новой строки из каждого элемента списка.


Пример:

@lines = ; # Прочитать все строки
chomp(@lines); # Удалить все завершающие символы новой строки

Но чаще эта задача решается конструкцией, похожей на приводившуюся ранее:
chomp(@lines = ); # Прочитать только текст без символов новой строки

Находясь в своей уединенной рабочей секции, вы можете использовать любую из этих конструкций, но большинство программистов предпочитает вторую, более компактную запись. Очевидно (хотя, как показывает опыт, не всем), что прочитанные строки входных данных невозможно прочитать заново. После достижения конца файла дальнейших данных для чтения не остается. Что произойдет, если данные поступают из 400Qмегабайтного журнала? Оператор построчного ввода прочитает все строки, выделив для их хранения громадный блок памяти. Perl обычно старается не ограничивать программиста, но другие пользователи системы (не говоря уже о системном администраторе) будут возражать. При большом объеме входных данных чаще всего приходится искать способ обработки данных без их одновременной загрузки в память.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Главная служебная переменная: $_
Интерполяция массивов в строках
Использование выражений, создающих скаляры, в списочном контексте
Использование выражений, создающих списки, в скалярном контексте
Обращение к элементам массива

Вернуться в раздел: Perl / 2. Списки и массивы