Блог дизайнера

МЕНЮ
  • Подборки с фотографиями

Perl дописать в файл

chomp часто используется при чтении из файла. По умолчанию он обрезает символ новой строки, хотя его полная функциональность относится к perldocs .

Остерегайтесь разницы между символами и байтами: не все кодировки, особенно UTF-8, используют 1-байтовые символы. Несмотря на то, что PerlIO обрабатывается почти безупречно, есть одна потенциальная ошибка:

  • read использует символы для параметров длины и смещения
  • seek и tell всегда использовать байты для позиционирования

Поэтому не используйте арифметику на основе этих смешанных значений. Вместо этого используйте, например, Encode::encode('utf8',$value_by_read) чтобы получить октеты (байты) из результата read , счет которых вы можете использовать с tell и seek .

Что такое файловые манипуляторы, и с чем их едят

Доступ к файлам осуществляется с помощью файловых манипуляторов, которые представляют собой так сказать синоним файла. Они не являются переменными, а поэтому их нельзя непосредственно присваивать другим переменным или передавать в функции (для этого нужно, что называется, пойти другим путем).

Есть и стандартные Перловские файловые манипуляторы. Они называются STDIN (стандартный ввод), STDOUT (стандартный вывод) и STDERR (стандартный поток ошибок). Например параметры скрипту из формы передаются именно через STDIN (при условии использования метода POST).

Если понадобится создать копию файлового манипулятора (не файла, а только манипулятора по которому осуществляется доступ к файлу), то можно воспользоваться функцией open (о ней подробнее поговорим позже).

О присваивании переменным файловых манипуляторов:

И под конец скажу, что файловые манипуляторы в Perl используются не только для связи с, собственно, файлом. Они могут быть связаны с каким-нибудь процессом, сокетом и т.д. Но это не входит в тематику статьи.

Открой или умри (open or die)

Это "стандартная идиома" open or die. Очень часто встречается в Perl.

die - это вызов функции, которая бросит исключение и таким образом завершит наш скрипт.

"open or die" это логическое выражение. Как вы знаете из предыдущей части учебника, "or" в Perl (как и во многих других языках) сокращается. Это значит, что если левая часть вернет TRUE, сразу понятно, что все выражение будет равно TRUE, так что правая часть вообще не выполняется. С другой стороны, если левая часть вернет FALSE, то правая часть выполнится, и результат ее выполнения и будет результатом всего выражения.

В данном случае мы используем эту особенность сокращения в нашеи выражении.

Если open() выполнится успешно, он вернет TRUE, и правая часть так и не выполнится. Скрипт просто перейдет к следующей строчке.

Если же open() не выполнится, он вернет FALSE. Тогда выражение справа от or тоже выполняется. Это приводит к исключению, и скрипт завершается.

В этом примере мы не проверяем итогового значения логического выражения, оно нам не нужно. Мы использовали это выражение только ради "побочного эффекта".

и НЕ увидим "готово".

Вместо того, чтобы просто вызвать die без параметра, можно добавить некоторое объяснение того, что же произошло.

Так-то лучше, но в какой-то момент кто-нибудь попробует поменять путь на корректную директорию.

Так что будет лучше использовать в качестве названия файла переменную:

Этот код выдаст

Так гораздо лучше.

Ну а теперь вернемся к исходному примеру.

Установка кодировки по умолчанию для ввода-вывода

Эта pragma изменяет режим чтения и записи текста (файлы, стандартный ввод, стандартный вывод и стандартную ошибку) по умолчанию в UTF-8, что обычно требуется при написании новых приложений.

ASCII - это подмножество UTF-8, поэтому это не вызовет проблем с устаревшими файлами ASCII и поможет защитить вас от случайного повреждения файлов, которое может произойти при обработке файлов UTF-8 как ASCII.

Тем не менее, важно знать, что такое кодирование ваших файлов, с которыми вы имеете дело, и обрабатывать их соответственно. ( Причины того, что мы не должны игнорировать Unicode. ) Для более глубокого изучения Unicode обратитесь к теме Unicode Perl .

Ezoic

report this ad

Многие Perl-программисты имеют дело с текстовыми файлами, такими как конфиги или лог-файлы, поэтому, чтобы получить некоторые полезные знания, важно как можно раньше научиться работать с файлами.

Для начала давайте узнаем, как записывать данные в файл, так как это кажется наиболее простой задачей.

Прежде чем записывать в файл, нужно открыть его, то есть попросить операционную систему (Windows, Linux, OSX и т. д.) открыть канал, по которому ваша программа сможет "общаться" с файлом. Для этого в Perl есть функция

Это хороший рабочий пример и мы к нему еще вернемся, но сперва давайте попробуем пример попроще:

1 Answer 1

(This is the official perlfaq answer, minus any subsequent edits)

The basic idea of inserting, changing, or deleting a line from a text file involves reading and printing the file to the point you want to make the change, making the change, then reading and printing the rest of the file. Perl doesn't provide random access to lines (especially since the record input separator, $/ , is mutable), although modules such as Tie::File can fake it.

A Perl program to do these tasks takes the basic form of opening a file, printing its lines, then closing the file:

Within that basic form, add the parts that you need to insert, change, or delete lines.

To prepend lines to the beginning, print those lines before you enter the loop that prints the existing lines.

To change existing lines, insert the code to modify the lines inside the while loop. In this case, the code finds all lowercased versions of "perl" and uppercases them. The happens for every line, so be sure that you're supposed to do that on every line!

To change only a particular line, the input line number, $., is useful. First read and print the lines up to the one you want to change. Next, read the single line you want to change, change it, and print it. After that, read the rest of the lines and print those:

To skip lines, use the looping controls. The next in this example skips comment lines, and the last stops all processing once it encounters either __END__ or __DATA__ .

Do the same sort of thing to delete a particular line by using next to skip the lines you don't want to show up in the output. This example skips every fifth line:

If, for some odd reason, you really want to see the whole file at once rather than processing line-by-line, you can slurp it in (as long as you can fit the whole thing in memory!):

Modules such as File::Slurp and Tie::File can help with that too. If you can, however, avoid reading the entire file at once. Perl won't give that memory back to the operating system until the process finishes.

You can also use Perl one-liners to modify a file in-place. The following changes all 'Fred' to 'Barney' in inFile.txt, overwriting the file with the new contents. With the -p switch, Perl wraps a while loop around the code you specify with -e , and -i turns on in-place editing. The current line is in $_ . With -p , Perl automatically prints the value of $_ at the end of the loop. See perlrun for more details.

To make a backup of inFile.txt, give -i a file extension to add:

To change only the fifth line, you can add a test checking $. , the input line number, then only perform the operation when the test passes:

To add lines before a certain line, you can add a line (or lines!) before Perl prints $_ :

You can even add a line to the beginning of a file, since the current line prints at the end of the loop:

To insert a line after one already in the file, use the -n switch. It's just like -p except that it doesn't print $_ at the end of the loop, so you have to do that yourself. In this case, print $_ first, then print the line that you want to add.

Я собираюсь рассказать об однострочных программах на Perl. Если вы овладете однострочным Perl`ом, то можете сэкономить кучу времени (я экономлю).

Цель поста — показать как Perl можно использовать заместо find, grep, awk, sed. В конце поста будет написано зачем это надо.

Ну обо всём по порядку.

Флаги

Флаг -e
Флаг позволяет запускать перловый код прямо в консоли, эту возможность я использую для проверки какого-нибудь тестового кода.
Допустим, я хочу узнать десятичное значение шестнадцатеричного числа 0xFA23B:

Примечание. Когда однострочный перловый код запускаем из под Винды, то код нужно заключать в двойные кавычки:
, в случае Линукса/Юникса код может быть как в двойных кавычках, так и в одинарных, но в Юниксе/Линуксе случае двойных кавычек приходится экранировать знаки "$":
Примечание. После флага -e должен следовать сразу код.

Флаг -l
Это флаг делает инициализирует переменные $/ и $\ значением "\n";
Переменная $/ задаёт разделитель входных полей.
Переменная $\ задаёт, что будет выводиться после команды print.

Таким образом в конце не приходится писать print "\n";

Флаг -n
Отсюда начинается самое интересное.

Где же это можно использовать?
А вот, например, нам надо добавить к именам файлов, имена которых начинаются с цифр, расширение «bak»:

А для Windows? Пожалуйста:

Посмотрим на получившуюся программу:

chomp $_; взялся от флага -l: он совместно с -n даёт добавляет ещё и chomp $_;, а не только BEGIN < $/ = "\n"; $\ = "\n"; >

Флаг -a
Флаг -a позволяет использовать Perl как awk.

То есть каждая строка расщепляется split`ом по пробелам, и получившиеся поля кладутся в массив @F.
Разделитель полей можно поменять с помощью флага -F.

Допустим, надо вывести из файла /etc/passwd имена пользователей с их домашними директориями:

А Винде я, например, хочу узнать имена файлов в папке, которые последний раз изменял в сентябре 2009:

Флаг -p
Этот флаг делает тоже, что -n только добавляет ещё блок continue c «print $_».

Допустим, мы выводим файл /etc/passwd, попутно заменяя 3 на 6.

Вместо такого кода:

Мы можем написать:

Флаг -i
Флаг i позволяет изменять файлы.

которая в свою очередь эквивалентна этой:

В кратце поясню, что происходит, когда вызываются строки perl -i.bak -pe «код» . Например, мы вызываем:

Файл test.txt переименовывается в файл test.txt.bak, и создаётся новый файл test.txt. Потом в каждой строке исходного файла заменяется foo на bar, которые записываются в новый фалй test.txt (по-видимому, хоть файл и переименовали, мы всё равно имеем доступ к его строкам?)

Допустим, нужно в файле заменить \r\n на \n:

В результате этого кода получатся два файла: один — test.txt.bak, который является копией исходного, другой — test.txt, где \r\n заменено на \n.

Примечание. Если вы посмотрите внимательно на программу выше ( $extension = '.bak'; . ), то увидите, что если вызывать вот так: perl -ibak_*…, то бэкапный файл будет называться «bak_test.txt», то есть если есть звёздочка в значении параметра i, то это это значение расматривается не как расширение, а как шаблон, где звёздочка обозначает имя файла.

Флаг -M позволяет подключать модули

Например, я хочу узнать где лежит модуль CGI:

Недавно мне понадобилось сделать chmod a+x всем файлам с расширением ".cgi",
но на сервере флаг -R для chmod почему-то не работал, так вот что я сделал, что-то подобное:

Этим кодом «perl -MFile::Find -e 'finddepth(sub , ».">)'" Я вызвал функцию finddepth модуля File::Find, которая рекурсивно обошла текущую директорию и вывела полные пути файлов.

Потом грепом я взял только те файлы, которые оканчиваются на '.cgi' (-P означает, что используются перловые регулярные выражения), а следующей программой «perl -nle '`chmod a+x $_`'» я сделал права на выполнение найденым файлам.

Хотя этот код я мог бы записать так:

Заметьте, что надо использовать флаг -l, чтобы в $_, попало имя файла без "\n"

А что если надо подключить некоторые переменные или подпрограммы из подключаемого пакета в пакет main?
Тогда надо писать:

BEGIN и END

Можно использовать BEGIN и END, для действий, которые должны происходить в начале и в конце, аналогично как у awk.

Например выведем линии, состоящие из 40 знаков " perl">dir /b | perl -pe "sub line ;BEGIN;END"

Дебаг

Чтобы дебажить однострочные программы надо подключать модуль B::Deparse,

Если вы запустите:

То получите вывод:

модуль B::Deparse нужно подключать так: "-MO=Deparse", а не так: "-MB::Deparse". Видимо это сделано для того, чтобы чётко определить, что мы хотим использовать этот модуль для вывода исходного кода программы, а не просто для использования каких его либо методов в программе.

Вот так модуль B::Deparse будет использоваться как обычный модуль, вывода кода не будет:

В примерах выше я использовал MO=Deparse для вывода кода программ.

Примеры однострочных программ

Вывод количества строк в файле (аналог Юниксовского wc -l)

Здесь использован хитрый приём ">

Вывод двоичного числа

Замена \r\n на \n в файле

Примечание. Почему-то подобный код не работает в Винде: она упорно добавляет \r\n, я делал binmode ARGV,
binmode $ARGV, binmode *ARG, но ничего не помогало, буду биться дальше. Буду благодарен вам, если напишите как заменить \r\n на \n в Винде.

Преобразование IP адреса из формы «цифры-точки» в число:

Удаление папок .svn в текущей папке и её подпапках (рекурсивно)

тоже самое для Windows:

Вывод IP-aдреса в шестнадцатеричной форме

Зачем это надо?

Как и обещал напишу, зачем это всё надо. Вы можете сказать, что есть find, awk, grep, sed, зачем однострочный Perl?

Ну во-первых, в Винде, по-умолчанию, грепа и awk нету. Да конечно быстрее пользоваться grep для отбора строк, но что если надо сделать чуть по-больше, например переименовать файл? Вы скажете есть ведь find, да есть. Так что же я скажу в защиту однострочного перла?

Во-первых, если программируешь на Perl, то Perl помнишь очень хорошо и можешь сразу начать писать однострочную программу, не заглядывая в man. (Поначалу, правда, может быть немного не привычно, но когда втянешься, будет легко)

Во-вторых, бывает удобно использовать именно Perl. Например, когда я хочу иметь аналог awk (смотри флаг -a) с мощью Perl (например хочу использовать в однострочной программе функции pack, unpack или регулярные выражение Perl)

В-третьих,
Perl — мощный язык. Однострочная программа на perl — это обычная программа на Perl, только в командной строке. А значит однострочные программы на перл можно использовать для самых разных задач! (Но думаю, длинные однострочные программы, наверно, лучше не писать, лучше сделать обычный перловый скрипт).

Заключение

Не подумайте только, что я призываю отказаться от grep, find, sed или awk. Не призываю! Я сам продолжаю использовать grep, find. Просто я хотел рассказать о ещё одном полезном инструменте как «однострочный перл», который удобен для тех кто программирует на Perl, ибо: 1) не надо читать man (ты и так всё помнишь), 2) используется мощь Perl

Спасибо за внимание. Тех кто заинтересовался отсылаю сюда:

Советую гуглить перловые однострочные программы с словом: one-liners

обн:
Чтобы заменить \r\n на \n в Винде, надо просто написать:

обн:
Добавил в код от AntonShcherbinin, "s/\r|\n//g;", а то в Линуксе просто binmode не прокатывает, теперь этот код универсален: работает и в Винде, и в Линуксе.

О том, что такое файл писать я надеюсь ненужно, но думаю нужно подумать над тем, что с ними можно делать, как видно из заголовка статьи, на Perl. Ну, приступим .

В этой статье обсудим:

Открытие общих текстовых файлов ASCII

Это основная идиома для «default» File IO и делает $filehandle доступным для чтения входным потоком bytes , отфильтрованный стандартным системным декодером, который может быть локально установлен с open прагмой

В Windows декодер по умолчанию является фильтром «CRLF», который отображает последовательности «\ r \ n» на входе в «\ n»,

Обработка ошибок

Давайте возьмем предыдущий пример и заменим имя файла на несуществующий путь. Например:

На самом деле, это просто предупреждение; скрипт продолжает выполняться, и поэтому мы увидим на экране слово "готово".

Более того, мы увидим предупреждение только потому, что явно запросили отображение предупреждений с помощью выражения use warnings . Попробуем закомментировать use warnings и увидим, что теперь скрипт молчит при неудачной попытке открыть файл. Так что вы даже не заметите этого, пока клиент, или, хуже того, ваш начальник, начнет жаловаться.

В любом случае, налицо проблема. Мы попытались открыть файл. Это не получилось, но мы все равно пытались туда что-то записать.

Лучше бы нам проверить, успешно ли сработал open() , прежде чем продолжать.

К счастью, вызов open() сам по себе возвращает TRUE в случае успеха и FALSE при отказе, так что мы можем сделать так:

Открытие файла FileHandle для чтения

Открытие двоичных файлов

Это указывает, что Perl не должен выполнять трансляцию CRLF в Windows.

Работа со строками в файле

Так как именно те файлы, которые содержат строковую информацию составляют наибольший интерес для, собственно, человека, то и речь сейчас пойдет именно о них.

Для чтения строк из файла используется файловый манипулятор "поставленный" в <>.

Если не указано иначе, то внутри такого цикла используется стандартная переменная "$_", а номер строки записывается в "$.". Так как конец строки обозначается спецсимволом, например "\n", для получения самой строки (без эдакого "хвоста") нужно ее усечь функцией chomp.

Можно прочитать строки в массив:

Для передвижения по файлу используются функции tell и seek.

Функция tell принимает в качестве параметра файловый манипулятор, а seek берет три параметра. Первый - файловый манипулятор, второй - смещение в байтах, третий - направление смещение. Есть три направления смещения: 0 - от начала файла, 1 - от текущей позиции, 2 - с конца файла.

Нельзя сказать, что это все, что нам предлагает Perl для работы с файлами. Будем надеяться, что у меня будет время на то, чтобы написать о том, как работать с каталогами, тонкости при работе с бинарными файлами, объектно-ориентированный подход к управлению файлами и их содержимым.

Запись gzip-файла

Чтобы написать gzip-файл, use модуль IO::Compress::Gzip и создайте дескриптор файла, создав новый экземпляр IO::Compress::Gzip для желаемого выходного файла:

Открытие текстовых файлов UTF8

Это указывает, что Perl должен избегать CRLF перевода, а затем декодировать полученные байты в строки символов (внутренне реализуемые как массивы целых чисел, которые могут превышать 255) вместо строк байтов

Больше?

Знак "больше" в вызове open может показаться непонятным, но если вы знакомы с перенаправлениями в командной строке, вы поймете, что он значит. А если нет, просто представьте, что это стрелка, показывающая направление потока данных: в файл справа.

Чтение из файла

Если вы знаете, что ваш входной файл UTF-8, вы можете указать кодировку:

После завершения чтения из файла дескриптор файла должен быть закрыт:

Другим и более быстрым способом чтения файла является использование модуля File :: Slurper. Это полезно, если вы работаете со многими файлами.

Чтение и запись сжатых файлов gzip

Чтение из gzip-файла

Чтобы прочитать из gzip-файла, use модуль IO::Uncompress::Gunzip а затем создайте дескриптор файла, создав новый экземпляр IO::Uncompress::Gunzip для входного файла:

«использовать autodie», и вам не нужно будет проверять ошибки открытия / закрытия файла

Запись в файл

Этот код открывает файл для записи. Возвращает ошибку, если файл не может быть открыт. Также закрывает файл в конце.

Теперь у нас есть открытый файл, готовый для записи, к которому мы обращаемся через $fh (эта переменная называется дескриптором файла ). Затем мы можем направлять вывод в этот файл с помощью оператора print :

Оператор open имеет в качестве первого параметра скалярную переменную ( $fh в этом случае). Поскольку он определен в операторе open он рассматривается как дескриптор файла . Второй параметр ">" (больше) определяет, что файл открыт для записи. Последний параметр - это путь к файлу для записи данных.

Чтобы записать данные в файл, используется оператор print вместе с дескриптором файла . Обратите внимание, что в операторе print нет запятой между дескриптором файла и самим заявлением, просто пробелы.

Не латиница?

Если вам нужно работать с символами, не входящими в таблицу ASCII, вам стоит сохранять их в UTF-8. Чтобы это сделать, нужно сообщить Perl'у, что вы открываете файл в кодировке UTF-8.

Vladimir Zatoloka

Gabor Szabo

Published on 2013-07-09

If you have any comments or questions, feel free to post them on the source of this page in GitHub. Source on GitHub. Comment on this post

I want to make changes to the contents of a file by modifying, deleting or inserting lines or appending to the beginning of the file. How can I do that in Perl?

Перемотайте файл-дескриптор

Иногда бывает необходимо отступить после прочтения.

Простой пример

Здесь тоже нужны кое-какие объяснения. Функция open принимает 3 параметра.

Первый, $fh , это скалярная переменная, которую мы объясляем в вызове open() . Мы могли бы объявить ее раньше, но обычно проще объявить ее прямо в вызове, хотя на первый взгляд это может выглядеть немного странно. Второй параметр определяет, каким образом мы открываем файл. В данном случае мы поставили знак "больше" ( > ), что значит, что файл открывается для записи. Третий параметр - путь к файлу, который мы хотим открыть.

Когда эта функция вызывается, она присваивает переменной $fh специальный ключ, который называется указателем файла (file-handle). Нам не важно само содержимое этой переменной; в дальнейшем мы просто используем ее. Главное, обратите внимание, что содержимое файла по-прежнему находится на диске, и НЕ попадает в переменную $fh.

Когда файл открыт, мы можем использовать указатель $fh в выражении print() . Это выглядит почти так же, как print() в других частях нашего учебника, но в качестве первого параметра мы передаем указатель файла, и после него нет(!) запятой.

Этот вызов print() запишет текст в наш файл.

Затем в следующей строчке мы закрываем указатель на файл. Строго говоря, в Perl это не обязательно. Perl автоматически и корректно закроет все файловые указатели, когда переменная покинет область видимости, то есть, в крайнем случае, когда скрипт завершится. Но, так или иначе, явно закрывать файлы считается хорошей практикой.

Последняя строчка print "done\n" нужна только для того, чтобы пояснить следующий пример:

Манипуляции с файлом

Открытие файла осуществляется функцией open.

Разберемся. У функции три параметра: FFF - название файлового манипулятора (его задаете вы), режим доступа ">" и "file.txt" - имя нужного вам файла. Есть три основных режима: ">" - запись,">"- добавление в файл.

Есть еще функция sysopen. Работа с ней не на много сложнее, чем с open, зато с ее помощью вы сможете более детально "сказать" системе о ваших намерениях (то есть то, что вы хотите сделать с файлом).

В sysopen три обязательных параметра и один необязательный.

FH - собственно, файловый манипулятор, $name - имя файла в чистом виде (без ">" и др.). В $flags помещаем число, полученное объединением нижеописанных констант через OR ( | ):

O_RDONLY Только для чтения
O_WRONLY Только для записи
O_RDWR Для чтения и для записи
O_CREAT Если файла нет, создать!
O_APPEND Открытие в режиме присоединения
O_TRUNC Очищаем содержимое при открытии

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

И наконец $param. Этот параметр задает маску доступа к файлу и записывается в восьмеричной системе. Обычно используется значение 0666 (значение по умолчанию, то есть если $param опущен), или 0777. Первое значение используется для обычных файлов, второе же для каталогов и исполняемых файлов.

Пример открытия файла для записи (если не найден - создается):

Запись в файл делаем функцией print.

Здесь FFF - имя файлового манипулятора, а строка в кавычках - текст, который мы хотим записать в файл, ассоциированный с FFF.

Если до попытки открытия файла не существовало, то функция open его создаст, а если файл был, и он был не пустой, то после вышеуказанной функции print, в нем ничего не останется от предыдущей информации, а записана будет та ерунда, которую я там вписал.

Как уже было сказано, существуют три стандартных файловых манипулятора, и при опущенном файловом манипуляторе функция print осуществит вывод в STDOUT (то же относится к функциям printf и write). Чтобы изменить направление вывода в Perl предусмотрена функция select (правда не только для этого). Пример:

Закрываем файл функцией close.

Принцип убирать за собой прививается всем с детства. Давайте не забывать об этом и в программировании, хотя при завершении процесса, в котором был открыт данный файл, файл закрывается автоматически.

Во-первых для чего? А для того, что если несколько процессов хотят одновременно заполучить доступ к файлу, причем на запись, причем еще и хотят туда что-то писать (кошмар), то представьте, что оказалось бы, если не этот чудный механизм блокировки. Он позволяет, грубо говоря, ставить процессы в очередь. Делаем так:

О функциях open и close уже говорили, а на flock остановимся немного подробнее. Она получает два параметра - файловый манипулятор и, образно говоря, категорию блокировки.

Про снятие блокировки: блокировка автоматически снимается при завершении процесса, вызванного текущим скриптом, либо при закрытии файлового манипулятора, который "привязан" к заблокированному файлу. Если вы снимаете блокировку вручную, будьте аккуратны - вы даете возможность другому процессу делать с (ВНИМАНИЕ!) не закрытым вами файлом все что ему угодно! Последствия могут быть, мягко говоря, неприятные, а грубо говоря - непредсказуемые (для вас непредсказуемые).

autodie позволяет работать с файлами без явной проверки ошибок при открытии / закрытии.

Начиная с Perl 5.10.1, прагма autodie была доступна в ядре Perl. При использовании Perl автоматически проверяет наличие ошибок при открытии и закрытии файлов.

Ниже приведен пример, в котором все строки одного файла считываются, а затем записываются в конец файла журнала.

Кстати, вы должны технически всегда проверять утверждения print . Многие люди этого не делают, но perl (интерпретатор Perl) не делает этого автоматически, и не делает autodie .

Чтение и запись в файл

Прежде чем читать и писать текстовые файлы, вы должны знать, какую кодировку использовать. См. Документацию Perl Unicode для более подробной информации о кодировании . Здесь мы показываем настройку UTF-8 как кодировку и декодирование по умолчанию для open функции. Это делается с использованием open прагмы в верхней части вашего кода (сразу после use strict; режима и use warnings; было бы уместно):

Функция open создает дескриптор файла, который используется для чтения и / или записи в файл. open функция имеет подпись

open(FILEHANDLE, MODE, FILEPATH) и возвращает ложное значение, если операция open(FILEHANDLE, MODE, FILEPATH) с ошибкой. Затем описание ошибки сохраняется в $! ,

чтение

Пишу

Чтение кусков

Открытие и чтение больших файлов может занять некоторое время и ресурсы. Если требуется только небольшая часть содержимого, может быть хорошей идеей прочитать содержимое в кусках, используя функцию read которая имеет подпись

read(FILEHANDLE, SCALAR, LENGTH, OFFSET)

FILEHANDLE должен быть открытым дескриптором файла, SCALAR будет удерживать прочитанные данные после операции. LENGTH определяет количество символов для чтения, начиная с OFFSET . Функция возвращает количество прочитанных символов, 0 если конец файла был достигнут, а undef в случае ошибки.

Считывает 16 символов из начала файла в $data .

Читайте также:

      
  • Какой хэш используется при аутентификации пользователя по протоколу kerberos
  •   
  • Снять frp блокировку samsung новый способ без компьютера а71
  •   
  • Страшные игры не на компьютере
  •   
  • Acmepower rc 6 перестал показывать дисплей
  •   
  • Не получается заблокировать телефон через google аккаунт с компьютера
  • Контакты
  • Политика конфиденциальности