Perl - We / Wy pliku

Podstawy obsługi plików są proste: kojarzysz plik filehandle z jednostką zewnętrzną (zwykle plikiem), a następnie użyj różnych operatorów i funkcji w Perlu, aby odczytać i zaktualizować dane przechowywane w strumieniu danych skojarzonym z uchwytem pliku.

Uchwyt pliku to nazwana wewnętrzna struktura Perla, która wiąże fizyczny zbiór z nazwą. Wszystkie uchwyty plików mają dostęp do odczytu / zapisu, dzięki czemu można odczytywać i aktualizować dowolny plik lub urządzenie skojarzone z uchwytem pliku. Jednak po skojarzeniu uchwytu pliku można określić tryb, w którym uchwyt pliku jest otwierany.

Trzy podstawowe uchwyty plików to - STDIN, STDOUT, i STDERR, które reprezentują odpowiednio standardowe wejście, standardowe wyjście i standardowe urządzenia błędów.

Otwieranie i zamykanie plików

Istnieją dwie funkcje z wieloma formularzami, których można użyć do otwarcia dowolnego nowego lub istniejącego pliku w Perlu.

open FILEHANDLE, EXPR
open FILEHANDLE

sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE

W tym miejscu UCHWYT PLIKU jest uchwytem pliku zwróconym przez open funkcja, a WYRAŻ to wyrażenie mające nazwę pliku i tryb otwierania pliku.

Otwórz funkcję

Poniżej znajduje się składnia do otwarcia file.txtw trybie tylko do odczytu. Tutaj mniej niż znak <wskazuje, że plik musi być otwarty w trybie tylko do odczytu.

open(DATA, "<file.txt");

Tutaj DANE to uchwyt pliku, który zostanie użyty do odczytania pliku. Oto przykład, który otworzy plik i wydrukuje jego zawartość na ekranie.

#!/usr/bin/perl

open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!";

while(<DATA>) {
   print "$_";
}

Poniżej przedstawiono składnię otwierania pliku file.txt w trybie pisania. Tutaj znak mniejszy niż> wskazuje, że plik musi być otwarty w trybie zapisu.

open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";

Ten przykład w rzeczywistości obcina (opróżnia) plik przed otwarciem go do zapisu, co może nie być pożądanym efektem. Jeśli chcesz otworzyć plik do czytania i pisania, możesz umieścić znak plus przed znakami> lub <.

Na przykład, aby otworzyć plik do aktualizacji bez jego obcinania -

open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";

Aby najpierw obciąć plik -

open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";

Możesz otworzyć plik w trybie dołączania. W tym trybie punkt zapisu zostanie ustawiony na końcu pliku.

open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";

Podwójne >> otwiera plik do dołączenia, umieszczając wskaźnik pliku na końcu, dzięki czemu można natychmiast rozpocząć dołączanie informacji. Jednak nie możesz z niego czytać, chyba że umieścisz przed nim również znak plus -

open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";

Poniższa tabela przedstawia możliwe wartości różnych trybów

Sr.No. Podmioty i definicja
1

< or r

Dostęp tylko do odczytu

2

> or w

Tworzy, zapisuje i obcina

3

>> or a

Pisze, dołącza i tworzy

4

+< or r+

Czyta i pisze

5

+> or w+

Czyta, pisze, tworzy i obcina

6

+>> or a+

Czyta, zapisuje, dołącza i tworzy

Funkcja Sysopen

Plik sysopen funkcja jest podobna do głównej funkcji otwartej, z tym wyjątkiem, że wykorzystuje system open() funkcji, wykorzystując podane parametry jako parametry funkcji systemowej -

Na przykład, aby otworzyć plik do aktualizacji, emuluj rozszerzenie +<filename format od otwarcia -

sysopen(DATA, "file.txt", O_RDWR);

Lub skrócić plik przed aktualizacją -

sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );

Możesz użyć O_CREAT do utworzenia nowego pliku i O_WRONLY- do otwarcia pliku w trybie tylko do zapisu i O_RDONLY - do otwarcia pliku w trybie tylko do odczytu.

Plik PERMSargument określa uprawnienia do określonego pliku, jeśli ma zostać utworzony. Domyślnie trwa0x666.

Poniżej znajduje się tabela, która podaje możliwe wartości TRYBU.

Sr.No. Podmioty i definicja
1

O_RDWR

Czytaj i pisz

2

O_RDONLY

Tylko czytać

3

O_WRONLY

Tylko pisz

4

O_CREAT

Utwórz plik

5

O_APPEND

Dołącz plik

6

O_TRUNC

Obetnij plik

7

O_EXCL

Zatrzymuje się, jeśli plik już istnieje

8

O_NONBLOCK

Nieblokująca użyteczność

Zamknij funkcję

Aby zamknąć uchwyt pliku, a tym samym usunąć skojarzenie uchwytu z odpowiadającym mu plikiem, użyj rozszerzenia closefunkcjonować. To opróżnia bufory uchwytu pliku i zamyka deskryptor pliku systemowego.

close FILEHANDLE
close

Jeśli nie określono uchwytu pliku, zamyka on aktualnie wybrany uchwyt pliku. Zwraca prawdę tylko wtedy, gdy może pomyślnie opróżnić bufory i zamknąć plik.

close(DATA) || die "Couldn't close file properly";

Czytanie i pisanie plików

Gdy masz otwarty uchwyt pliku, musisz umieć czytać i zapisywać informacje. Istnieje wiele różnych sposobów odczytywania i zapisywania danych w pliku.

Operator <FILEHANDL>

Główną metodą odczytu informacji z otwartego uchwytu pliku jest operator <FILEHANDLE>. W kontekście skalarnym zwraca pojedynczą linię z uchwytu pliku. Na przykład -

#!/usr/bin/perl

print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";

Kiedy używasz operatora <FILEHANDLE> w kontekście listowym, zwraca on listę wierszy z określonego uchwytu pliku. Na przykład, aby zaimportować wszystkie wiersze z pliku do tablicy -

#!/usr/bin/perl

open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);

Funkcja getc

Funkcja getc zwraca pojedynczy znak z podanego UCHWYTU PLIKU lub STDIN, jeśli żaden nie został określony -

getc FILEHANDLE
getc

Jeśli wystąpił błąd lub uchwyt pliku znajduje się na końcu pliku, zamiast tego zwracany jest undef.

Przeczytaj funkcję

Funkcja odczytu odczytuje blok informacji z buforowanego uchwytu pliku: Ta funkcja służy do odczytu danych binarnych z pliku.

read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH

Długość odczytywanych danych jest definiowana przez LENGTH, a dane są umieszczane na początku SCALARA, jeśli nie określono OFFSETU. W przeciwnym razie dane są umieszczane po bajtach OFFSET w SCALAR. Funkcja zwraca liczbę bajtów odczytanych po pomyślnym zakończeniu, zero na końcu pliku lub wartość undef, jeśli wystąpił błąd.

funkcja drukowania

Dla wszystkich metod używanych do odczytywania informacji z uchwytów plików, główną funkcją zapisywania informacji z powrotem jest funkcja drukowania.

print FILEHANDLE LIST
print LIST
print

Funkcja drukowania wypisuje oszacowaną wartość LISTA do UCHWYTU PLIKU lub do bieżącego uchwytu pliku wyjściowego (domyślnie STDOUT). Na przykład -

print "Hello World!\n";

Kopiowanie plików

Oto przykład, który otwiera istniejący plik plik1.txt i odczytuje go wiersz po wierszu i generuje kolejną kopię pliku plik2.txt.

#!/usr/bin/perl

# Open file to read
open(DATA1, "<file1.txt");

# Open new file to write
open(DATA2, ">file2.txt");

# Copy data from one file to another.
while(<DATA1>) {
   print DATA2 $_;
}
close( DATA1 );
close( DATA2 );

Zmiana nazwy pliku

Oto przykład, który pokazuje, jak możemy zmienić nazwę pliku file1.txt na file2.txt. Zakładając, że plik jest dostępny w katalogu / usr / test.

#!/usr/bin/perl

rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );

Ta funkcja renames przyjmuje dwa argumenty i po prostu zmienia nazwę istniejącego pliku.

Usuwanie istniejącego pliku

Oto przykład, który pokazuje, jak usunąć plik file1.txt przy użyciu rozszerzenia unlink funkcjonować.

#!/usr/bin/perl

unlink ("/usr/test/file1.txt");

Pozycjonowanie wewnątrz pliku

Możesz użyć do tell funkcja, aby poznać bieżącą pozycję pliku i seek funkcji, aby wskazać określoną pozycję w pliku.

powiedz funkcji

Pierwszym wymaganiem jest znalezienie swojej pozycji w pliku, co robisz za pomocą funkcji tell -

tell FILEHANDLE
tell

Zwraca pozycję wskaźnika pliku, w bajtach, wewnątrz UCHWYTU PLIKU, jeśli jest określony, lub bieżącego domyślnego wybranego uchwytu pliku, jeśli żaden nie jest określony.

funkcja wyszukiwania

Funkcja seek ustawia wskaźnik pliku na określoną liczbę bajtów w pliku -

seek FILEHANDLE, POSITION, WHENCE

Funkcja korzysta z funkcji systemowej fseek i masz taką samą możliwość pozycjonowania względem trzech różnych punktów: początku, końca i bieżącej pozycji. Robisz to, określając wartość WHENCE.

Zero ustawia położenie względem początku pliku. Na przykład wiersz ustawia wskaźnik pliku na 256-ty bajt w pliku.

seek DATA, 256, 0;

Informacje o pliku

Możesz bardzo szybko przetestować pewne funkcje w Perlu, używając szeregu operatorów testów znanych łącznie jako testy -X. Na przykład, aby wykonać szybki test różnych uprawnień do pliku, możesz użyć takiego skryptu -

#/usr/bin/perl

my $file = "/usr/test/file1.txt";
my (@description, $size);
if (-e $file) {
   push @description, 'binary' if (-B _);
   push @description, 'a socket' if (-S _);
   push @description, 'a text file' if (-T _);
   push @description, 'a block special file' if (-b _);
   push @description, 'a character special file' if (-c _);
   push @description, 'a directory' if (-d _);
   push @description, 'executable' if (-x _);
   push @description, (($size = -s _)) ? "$size bytes" : 'empty';
   print "$file is ", join(', ',@description),"\n";
}

Oto lista funkcji, które możesz sprawdzić pod kątem pliku lub katalogu -

Sr.No. Operator i definicja
1

-A

Czas rozpoczęcia skryptu minus czas ostatniego dostępu do pliku w dniach.

2

-B

Czy to plik binarny?

3

-C

Czas rozpoczęcia skryptu minus czas ostatniej zmiany i-węzła pliku w dniach.

3

-M

Czas rozpoczęcia skryptu minus czas modyfikacji pliku, w dniach.

4

-O

Czy właścicielem pliku jest rzeczywisty identyfikator użytkownika?

5

-R

Czy plik można odczytać za pomocą rzeczywistego identyfikatora użytkownika lub prawdziwej grupy?

6

-S

Czy plik jest gniazdem?

7

-T

Czy to plik tekstowy?

8

-W

Czy plik jest zapisywalny przez rzeczywisty identyfikator użytkownika lub prawdziwą grupę?

9

-X

Czy plik jest wykonywalny przez rzeczywisty identyfikator użytkownika lub prawdziwą grupę?

10

-b

Czy jest to specjalny plik blokowy?

11

-c

Czy jest to specjalny plik znaków?

12

-d

Czy plik jest katalogiem?

13

-e

Czy plik istnieje?

14

-f

Czy to zwykły plik?

15

-g

Czy plik ma ustawiony bit setgid?

16

-k

Czy plik ma ustawiony bit lepki?

17

-l

Czy plik jest dowiązaniem symbolicznym?

18

-o

Czy właścicielem pliku jest efektywny identyfikator użytkownika?

19

-p

Czy plik jest potokiem nazwanym?

20

-r

Czy plik jest czytelny dla efektywnego identyfikatora użytkownika lub grupy?

21

-s

Zwraca rozmiar pliku, zerowy rozmiar = pusty plik.

22

-t

Czy uchwyt pliku jest otwarty przez TTY (terminal)?

23

-u

Czy plik ma ustawiony bit setuid?

24

-w

Czy efektywny identyfikator użytkownika lub grupy ma możliwość zapisu w pliku?

25

-x

Czy plik jest wykonywalny przez efektywnego identyfikatora użytkownika lub grupy?

26

-z

Czy rozmiar pliku wynosi zero?