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? |