Найти тему
Кладовая кода

Работа с файлами в Perl

1. Копирование файлов по маске

Для копирования файлов по маске в Perl можно использовать модуль File::Copy.

Пример кода:

use strict;
use warnings;
use File::Copy;

my $dir = '/path/to/directory';
my @files = glob("$dir/*.txt"); # выбор файлов по маске

foreach my $file (@files) {
    my $new_file = $file . '_copy'; # новое имя файла
    copy($file, $new_file) or die "Ошибка копирования файла $file: $!"; # копирование файла
}


В данном примере мы выбираем все файлы с расширением
.txt из директории /path/to/directory и копируем каждый из них, добавляя к имени файла суффикс '_copy'. Если происходит ошибка копирования, скрипт выводит сообщение об ошибке.

2. Поиск файлов по маске

Для поиска файлов по маске в Perl можно использовать модуль File::Find::Rule.

Например, для поиска всех файлов с расширением
.txt в директории и ее поддиректориях можно использовать следующий код:

use File::Find::Rule;

my @files = File::Find::Rule->file()
->name('*.txt')
->in('/path/to/directory');



Данный код создает объект
File::Find::Rule, который ищет только файлы (исключая директории) с расширением .txt в указанной директории и всех ее поддиректориях, и сохраняет их в массив @files.

Также возможно использование регулярных выражений для более сложных масок.

Например, для поиска файлов, начинающихся на букву "a" и содержащих цифры в директории и ее поддиректориях, можно использовать следующий код:

use File::Find::Rule;

my @files = File::Find::Rule->file()
->name(qr/^a.*\d/)
->in('/path/to/directory');


Здесь вместо строки
'.txt' в методе name используется регулярное выражение, начинающееся со строки 'a', содержащей любое количество символов (.*), и заканчивающееся цифрами (\d).

3. Работа с содержанием файла

Для чтения содержимого файла на Perl используется функция `open` в режиме чтения ("`<`"):

open(my $input_file, '<', 'имя_файла') or die "Не удалось открыть файл: $!";

Затем можно прочитать содержимое файла в переменную с помощью функции
`readline`:

my $text;
while (my $line = readline $input_file) {
$text .= $line;
}


Далее можно обработать текст, например, заменить все буквы на заглавные:

$text = uc $text;

Наконец, результат можно сохранить в другой файл с помощью функции
`open` в режиме записи ("`>`"):

open(my $output_file, '>', 'имя_файла') or die "Не удалось создать файл: $!";
print $output_file $text;
close $output_file;


В итоге полный код будет выглядеть примерно так:

open(my $input_file, '<', 'имя_файла') or die "Не удалось открыть файл: $!";
my $text;
while (my $line = readline $input_file) {
$text .= $line;
}
close $input_file;

$text = uc $text;

open(my $output_file, '>', 'имя_файла') or die "Не удалось создать файл: $!";
print $output_file $text;
close $output_file;

4. Информация о файле

Для получения информации о файлах в Perl можно использовать функции модуля File::stat.

Например, чтобы получить размер файла и его дату создания:

use File::stat;

my $filename = 'myfile.txt';
my $file_stat = stat($filename);

if ($file_stat) {
my $size = $file_stat->size;
my $created = $file_stat->ctime;
print "File $filename size: $size bytes, created: $created\n";
} else {
print "File $filename not found\n";
}


Функция
stat возвращает объект, содержащий информацию о файле. Методы этого объекта позволяют получать различную информацию о файле: размер, дату создания, дату последнего изменения и т.д.

Для получения списка файлов в директории можно использовать функцию модуля
File::Slurper.

Например, чтобы получить список всех файлов в директории:

use File::Slurper qw(read_dir);

my $dir = '/path/to/directory';
my @files = read_dir($dir);

foreach my $file (@files) {
print "$file\n";
}

5. Простой редактор работы с файлами

Напишем простой редактор работы с файлами на языке Perl:

#!/usr/bin/perl

# Получаем имя файла из аргументов командной строки
$file = $ARGV[0];

# Если файл не существует, то создаем его
if (! -e $file) {
open(FILE, "> $file");
close(FILE);
}


# Запускаем цикл редактирования файла
while (1) {
# Читаем содержимое файла
open(FILE, "< $file");
@lines = <FILE>;
close(FILE);

print "File: $file\n";
# Выводим содержимое файла на экран
foreach $line (@lines) {
print $line;
}


# Считываем команду от пользователя
print "\nCommand (q=quit, s=save): ";
$command = <STDIN>;
chomp($command);


# Разбираем команду пользователя
if ($command eq "q") {
# Выходим из редактора
last;
}
elsif ($command eq "s") {
# Сохраняем файл
open(FILE, "> $file");
foreach $line (@lines) {
print FILE $line;
}
close(FILE);
}
else {
# Редактируем файл
print "Input new line: ";
$newline = <STDIN>;
chomp($newline);
push(@lines, $newline);
}
}


Этот редактор позволяет открывать файлы, редактировать их содержимое, сохранять изменения и выходить из редактора.

Для запуска редактора необходимо вызвать скрипт с передачей имени файла, например:
`perl editor.pl test.txt`. Если файл не существует, он будет создан автоматически.

Для добавления новой строки в файл необходимо ввести любую другую команду, кроме
`q` и `s`. Новая строка будет добавлена в конец файла.

Для выхода из редактора необходимо ввести команду
`q`.

Для сохранения изменений необходимо ввести команду `s`. Это перезапишет содержимое файла, используя измененную версию.

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

6. Поиск файла по содержанию

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

Код:

#!/usr/bin/perl

use strict;
use warnings;

my $dir = '.'; # директория, которую нужно просканировать
my $search_term = 'example'; # строка для поиска

opendir(my $dh, $dir) or die "Cannot open directory $dir: $!";

while (my $file = readdir($dh)) {
next if ($file =~ /^\./); # пропустить скрытые файлы и директории
next unless (-f "$dir/$file"); # пропустить не файлы
my $contents;
open(my $fh, '<', "$dir/$file") or next; # если нельзя открыть файл, продолжить дальше
{
local $/;
$contents = <$fh>; # считать содержимое файла
}
close($fh);
if (grep /$search_term/, $contents) {
print "$file\n"; # если строка найдена, вывести имя файла
}
}

closedir($dh);


Как это работает:
- Переменные `
$dir` и `$search_term` задаются в начале.
- С помощью функции `
opendir` открывается директория `$dir`.
- Цикл `
while` проходит по содержимому директории, пропуская скрытые файлы и директории, и обрабатывает только обычные файлы.
- Для каждого файла открывается файловый дескриптор, чтобы считать его содержимое.
- Содержимое файла считывается с использованием функции `
local $/` и сохраняется в переменной `$contents`.
- Функция `grep` проверяет, есть ли `
$search_term` в `$contents`. Если есть, то имя файла выводится на экран.
- Директория закрывается с помощью функции `
closedir`.

6. Простой бэкап файла

Для создания бэкапа файлов в Perl можно использовать функцию `File::Copy::copy`. Например, для создания копии файла `my_file.txt` с добавлением даты к имени файла можно использовать следующий код:

use File::Copy;

my $file = 'my_file.txt';
my $backup_dir = 'backup/';

my $timestamp = localtime(time);
$timestamp =~ s/[:\s]/_/g;

my $backup_file = $backup_dir . $file . '.' . $timestamp;
copy($file, $backup_file) or die "Copy failed: $!";


В этом примере мы используем модуль `
File::Copy`, чтобы скопировать файл `my_file.txt` в папку `backup/` с новым именем, содержащим дату и время в формате `YYYY_MM_DD_HH_MM_SS`. Если копирование не удалось, программа выводит сообщение об ошибке.

7. Работа с MS Word (файлы документов)

Код Perl для работы с word:

use Win32::OLE; # подключаем Win32::OLE для работы с объектами OLE
use Win32::OLE::Const 'Microsoft Word'; # подключаем константы Microsoft Word


# создаем объект приложения Microsoft Word
my $word = Win32::OLE->new('Word.Application');
# устанавливаем visible в значение true для отображения приложения
$word->{visible} = 1;

# создаем новый документ
my $document = $word->Documents->Add();

# устанавливаем текст в документе
my $range = $document->Content();
$range->InsertAfter("Hello, world!");

# сохраняем документ
$document->SaveAs("C:\\path\\to\\document.docx");

# закрываем документ
$document->Close();

# закрываем приложение Microsoft Word
$word->Quit();

Работа с MS Excel (файлы таблиц)

В Perl можно использовать модули для работы с Excel, такие как Spreadsheet::ParseExcel, Spreadsheet::WriteExcel и Excel::Writer::XLSX.

Пример кода для чтения Excel-файла с помощью модуля
Spreadsheet::ParseExcel:

use strict;
use warnings;
use Spreadsheet::ParseExcel;

my $parser = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse('example.xls');

if ( !defined $workbook ) {
die $parser->error(), "\n";
}


for my $worksheet ( $workbook->worksheets() ) {
printf( "Sheet: %s\n", $worksheet->name() );

for my $row ( $worksheet->min_row() .. $worksheet->max_row() ) {
for my $col ( $worksheet->min_col() .. $worksheet->max_col() ) {
my $cell = $worksheet->get_cell( $row, $col );
next unless $cell;

printf( "(%s,%s) => %s\n", $row, $col, $cell->value() );
}
}
}


Пример кода для создания Excel-файла с помощью модуля
Excel::Writer::XLSX:

use strict;
use warnings;
use Excel::Writer::XLSX;

my $workbook = Excel::Writer::XLSX->new('example.xlsx');
my $worksheet = $workbook->add_worksheet();

$worksheet->write( 'A1', 'Hello' );
$worksheet->write( 'B1', 'World' );
$worksheet->write( 'C1', 42 );

$workbook->close();


Это только базовые примеры. Модули для работы с Excel позволяют делать более сложные операции, такие как форматирование, объединение ячеек, создание графиков и т.д.

8. Работа с каталогами

Для работы с каталогами в Perl используется модуль File::Path. Этот модуль автоматически создает все необходимые директории.

Вот пример кода Perl для создания и удаления каталогов:

use File::Path;

# создание каталога
my $dir = "/path/to/dir";
mkpath($dir) or die "Не удалось создать каталог $dir: $!";


# удаление каталога
rmtree($dir) or die "Не удалось удалить каталог $dir: $!";

Функция
mkpath() создает все промежуточные директории, если они отсутствуют. Функция rmtree() удаляет директорию и все ее содержимое.

Функции
mkpath() и rmtree() могут сгенерировать ошибки, поэтому рекомендуется использовать операторы die для обработки ошибок.

Также в Perl есть множество других функций для работы с каталогами, таких как
opendir(), readdir(), closedir(), chdir() и другие. Они позволяют открывать каталог, перебирать его содержимое, изменять текущий каталог и выполнять другие операции.