Що таке файлові маніпулятори, і з чим їх їдять, Статті, Perl, статті

Доступ до файлів здійснюється за допомогою файлових маніпуляторів, які являють собою так сказати синонім файлу. Вони не є змінними, а тому їх не можна безпосередньо присвоювати іншим змінним або передавати в функції (для цього потрібно, що називається, піти іншим шляхом).

Є й стандартні Перловська файлові маніпулятори. Вони називаються STDIN (Стандартний ввід), STDOUT (стандартний висновок) і STDERR (стандартний потік помилок). Наприклад параметри скрипту з форми передаються саме через STDIN (при умови використання методу POST).

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

Приклад:
open(FILL,"file.txt");
open(FAIL,"<&FILL");

Про присвоєнні змінним файлових маніпуляторів:

$handle=*FILL; або передати його у функцію:
some_sub(*FILL);

І під кінець скажу, що файлові маніпулятори в Perl використовуються не тільки для зв’язку з, власне, файлом. Вони можуть бути пов’язані з яким-небудь процесом, сокетом і т.д. Але це не входить в тематику статті.

Маніпуляції з файлом


Відкриття файлу здійснюється функцією open.

open(FFF,"> file.txt");

Розберемося. У функції три параметри: FFF – назва файлового маніпулятора (Його задаєте ви), режим доступу “>” і “file.txt” – ім’я потрібного вам файлу. Є три основні режими: “>” – запис, “<" - читання, ">>” – додавання у файл.

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

В sysopen три обов’язкові параметра і один необов’язковий.

Наприклад:
sysopen(FH,$name, $flags, $param);

FH – власне, файловий маніпулятор, $ name – ім’я файлу в чистому вигляді (без “>” Та ін.) В $ flags поміщаємо число, отримане об’єднанням нижчеописаних констант через OR (|):





















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

Це, звичайно, не повний перелік, але тут перераховані найнеобхідніші і часто використовувані константи.

І нарешті $ param. Цей параметр задає маску доступу до файлу і записується в вісімковій системі. Зазвичай використовується значення 0666 (значення за замовчуванням, тобто якщо $ param опущений), або 0777. Перше значення використовується для звичайних файлів, друге ж для каталогів і виконуваних файлів.

Приклад відкриття файлу для запису (якщо не знайдений – створюється):

sysopen(FH,"data.txt",O_WRONLY|O_TRUNC|O_CREATE);

Запис у файл робимо функцією print.

print (FFF “oppa! Пишемо в файл!”);

Тут FFF – ім’я файлового маніпулятора, а рядок у лапках – текст, який ми хочемо записати у файл, асоційований з FFF.

Якщо до спроби відкриття файлу не існувало, то функція open його створить, а якщо файл був, і він був не порожній, то після вищезазначеної функції print, в ньому нічого не залишиться від попередньої інформації, а записана буде та дурниця, яку я там вписав.

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

open(F1,"> one.txt"); print “Файл відкрито! Пишемо в STDOUT. “;
$old_point=select(F1); print “Пишемо в файл one.txt”;
select($old_point); print “Знову пишемо в STDOUT.”;
close(F1);

Закриваємо файл функцією close.

close(FFF);

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

Блокування файлу

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

open(FIL,"> file.dat");
flock(FIL,2);
close(FIL);

Про функції open і close вже говорили, а на flock зупинимося трохи детальніше. Вона отримує два параметри – файловий маніпулятор і, образно кажучи, категорію блокування.


  • 1 спільна блокування (для читання)
  • 2 монопольна блокування (для запису)
  • 4 асинхронний запит блокування
  • 8 розблокування

    Про зняття блокування: блокування автоматично знімається при завершенні процесу, викликаного поточним скриптом, або при закритті файлового маніпулятора, який “прив’язаний” до заблокованого файлу. Якщо ви знімаєте блокування вручну, будьте обережні – ви даєте можливість іншому процесу робити з (УВАГА!) не закритим вами файлом все що йому завгодно! Наслідки можуть бути, м’яко кажучи, неприємні, а грубо кажучи – непередбачувані (для вас непередбачувані).

    Робота з рядками в файлі


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

    Для читання рядків з файлу використовується файловий маніпулятор “поставлений” в
    <>.

    Наприклад:

    open(FIL,"data.txt");
    while(<FIL>)
    { # Робимо щось з кожним рядком файлу
    }

    Якщо не вказано інакше, то всередині такого циклу використовується стандартна змінна “$ _”, а номер рядка записується в “$.”. Так як кінець рядка позначається спецсимволів, наприклад “”, Для отримання самої рядка (без такого собі “хвоста”) потрібно її усікти функцією chomp.

    open(FIL,"data.txt");
    while(<FIL>)
    { chomp; # відрізається спецсимволів від змінної $ _ print; # пишемо $ _ на STDOUT
    }

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

    @strings=<FIL>;
    foreach $line (@strings)
    {
    print $list;
    }

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

    open(FIL,"data.txt");
    $position=tell(FIL); print “Поточна позиція у файлі $ position.
    ";
    seek(FIL,$position+10,1); print “А тепер перемістилися на 10 байт до кінця файлу від поточної позиції.
    ";
    $position=tell(FIL); print “Тепер поточна позиція у файлі $ position.
    ";

    Результат:

    Поточна позиція у файлі 0. А тепер перемістилися на 10 байт до кінця файлу. Тепер поточна позиція у файлі 10.

    Функція tell приймає як параметр файловий маніпулятор, а seek бере три параметри. Перший – файловий маніпулятор, другий – зміщення в байтах, третій – напрямок зміщення. Є три напрямки зміщення: 0 – від початку файлу, 1 – від поточної позиції, 2 – з кінця файлу.

    Не можна сказати, що це все, що нам пропонує Perl для роботи з файлами. Будемо сподіватися, що в мене буде час на те, щоб написати про те, як працювати з каталогами, тонкощі при роботі з бінарними файлами, об’єктно-орієнтований підхід до управління файлами і їх вмістом.

    Буду дуже вдячний за повідомлення про можливі помилки і неточності в цій статті.


  • Схожі статті:


    Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

    Коментарів поки що немає.

    Ваш отзыв

    Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

    *

    *