100 скриптов на Perl
Коллекция полезных скриптов на Perl с подробными объяснениями.
1. Обработка текста
1.1 Поиск и замена текста
#!/usr/bin/perl
use strict;
use warnings;
my $text = "Hello World";
$text =~ s/World/Perl/;
print "$text\n";
Этот скрипт демонстрирует базовую замену текста с помощью регулярных выражений.
1.2 Подсчет слов
#!/usr/bin/perl
use strict;
use warnings;
my $text = "Hello World Perl";
my @words = split(/\s+/, $text);
print "Количество слов: " . scalar(@words) . "\n";
Скрипт подсчитывает количество слов в строке, разделяя её по пробелам.
2. Работа с файлами
2.1 Чтение файла
#!/usr/bin/perl
use strict;
use warnings;
open(my $fh, '<', 'file.txt') or die "Не могу открыть файл: $!";
while (my $line = <$fh>) {
print $line;
}
close($fh);
Базовый пример чтения файла построчно.
2.2 Запись в файл
#!/usr/bin/perl
use strict;
use warnings;
open(my $fh, '>', 'output.txt') or die "Не могу открыть файл: $!";
print $fh "Hello, World!\n";
close($fh);
Пример записи текста в файл.
3. Работа с датами
3.1 Текущая дата
#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw(strftime);
my $date = strftime "%Y-%m-%d %H:%M:%S", localtime;
print "Текущая дата и время: $date\n";
Вывод текущей даты и времени в заданном формате.
3.2 Разница между датами
#!/usr/bin/perl
use strict;
use warnings;
use Time::Piece;
my $date1 = Time::Piece->strptime("2024-01-01", "%Y-%m-%d");
my $date2 = Time::Piece->strptime("2024-04-27", "%Y-%m-%d");
my $diff = $date2 - $date1;
print "Разница в днях: " . $diff->days . "\n";
Расчет разницы между двумя датами в днях.
4. Математические операции
4.1 Калькулятор
#!/usr/bin/perl
use strict;
use warnings;
sub add { return $_[0] + $_[1] }
sub subtract { return $_[0] - $_[1] }
sub multiply { return $_[0] * $_[1] }
sub divide { return $_[0] / $_[1] }
print "5 + 3 = " . add(5, 3) . "\n";
print "5 - 3 = " . subtract(5, 3) . "\n";
print "5 * 3 = " . multiply(5, 3) . "\n";
print "5 / 3 = " . divide(5, 3) . "\n";
Простой калькулятор с базовыми арифметическими операциями.
4.2 Генератор случайных чисел
#!/usr/bin/perl
use strict;
use warnings;
srand(time);
my $random = int(rand(100));
print "Случайное число от 0 до 100: $random\n";
Генерация случайного числа в заданном диапазоне.
5. Работа с массивами
5.1 Сортировка массива
#!/usr/bin/perl
use strict;
use warnings;
my @numbers = (5, 2, 8, 1, 9);
my @sorted = sort { $a <=> $b } @numbers;
print "Отсортированный массив: @sorted\n";
Сортировка числового массива по возрастанию.
5.2 Поиск в массиве
#!/usr/bin/perl
use strict;
use warnings;
my @array = qw(apple banana orange);
my $search = "banana";
if (grep { $_ eq $search } @array) {
print "Элемент найден\n";
} else {
print "Элемент не найден\n";
}
Поиск элемента в массиве.
6. Работа с хешами
6.1 Создание и доступ к хешу
#!/usr/bin/perl
use strict;
use warnings;
my %hash = (
'name' => 'John',
'age' => 30,
'city' => 'Moscow'
);
print "Имя: $hash{'name'}\n";
print "Возраст: $hash{'age'}\n";
Базовые операции с хешем в Perl.
6.2 Итерация по хешу
#!/usr/bin/perl
use strict;
use warnings;
my %hash = ('a' => 1, 'b' => 2, 'c' => 3);
while (my ($key, $value) = each %hash) {
print "$key => $value\n";
}
Перебор всех элементов хеша.
7. Регулярные выражения
7.1 Проверка email
#!/usr/bin/perl
use strict;
use warnings;
my $email = 'test@example.com';
if ($email =~ /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/) {
print "Email валиден\n";
} else {
print "Email невалиден\n";
}
Проверка валидности email адреса.
7.2 Извлечение чисел
#!/usr/bin/perl
use strict;
use warnings;
my $text = "Цена: 100 рублей, скидка: 20%";
my @numbers = $text =~ /(\d+)/g;
print "Найденные числа: @numbers\n";
Извлечение всех чисел из текста.
8. Работа с процессами
8.1 Запуск внешней команды
#!/usr/bin/perl
use strict;
use warnings;
my $output = `ls -l`;
print "Содержимое директории:\n$output";
Выполнение внешней команды и получение вывода.
8.2 Системные вызовы
#!/usr/bin/perl
use strict;
use warnings;
use POSIX;
my $pid = fork();
if ($pid == 0) {
# Дочерний процесс
print "Я дочерний процесс\n";
exit(0);
} else {
# Родительский процесс
print "Я родительский процесс\n";
waitpid($pid, 0);
}
Создание дочернего процесса.
9. Сетевое программирование
9.1 HTTP запрос
#!/usr/bin/perl
use strict;
use warnings;
use LWP::Simple;
my $url = 'http://example.com';
my $content = get($url);
print "Содержимое страницы:\n$content\n";
Получение содержимого веб-страницы.
9.2 TCP сервер
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket::INET;
my $server = IO::Socket::INET->new(
LocalPort => 8080,
Type => SOCK_STREAM,
Reuse => 1,
Listen => 10
) or die "Не могу создать сервер: $!";
print "Сервер запущен на порту 8080\n";
while (my $client = $server->accept()) {
print "Новое подключение\n";
print $client "Hello, Client!\n";
close($client);
}
Простой TCP сервер.
10. Работа с базами данных
10.1 Подключение к MySQL
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect(
"DBI:mysql:database=test;host=localhost",
"username",
"password"
) or die "Не могу подключиться: $DBI::errstr";
my $sth = $dbh->prepare("SELECT * FROM users");
$sth->execute();
while (my @row = $sth->fetchrow_array()) {
print "@row\n";
}
$dbh->disconnect();
Подключение к MySQL и выполнение запроса.
10.2 SQLite операции
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect("dbi:SQLite:dbname=test.db")
or die "Не могу подключиться: $DBI::errstr";
$dbh->do("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
$dbh->do("INSERT INTO users (name) VALUES ('John')");
my $sth = $dbh->prepare("SELECT * FROM users");
$sth->execute();
while (my @row = $sth->fetchrow_array()) {
print "@row\n";
}
$dbh->disconnect();
Работа с SQLite базой данных.
11. Обработка JSON
11.1 Парсинг JSON
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
my $json_text = '{"name":"John","age":30,"city":"Moscow"}';
my $data = decode_json($json_text);
print "Имя: $data->{'name'}\n";
print "Возраст: $data->{'age'}\n";
Декодирование JSON строки.
11.2 Генерация JSON
#!/usr/bin/perl
use strict;
use warnings;
use JSON;
my $data = {
name => 'John',
age => 30,
city => 'Moscow'
};
my $json_text = encode_json($data);
print "$json_text\n";
Создание JSON строки из Perl структуры.
12. Работа с XML
12.1 Парсинг XML
#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
my $xml = XML::Simple->new();
my $data = $xml->XMLin('data.xml');
print "Имя: $data->{name}\n";
print "Возраст: $data->{age}\n";
Чтение и парсинг XML файла.
12.2 Генерация XML
#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
my $data = {
name => 'John',
age => 30,
city => 'Moscow'
};
my $xml = XML::Simple->new();
my $xml_string = $xml->XMLout($data);
print "$xml_string\n";
Создание XML из Perl структуры.
13. Многопоточность
13.1 Создание потоков
#!/usr/bin/perl
use strict;
use warnings;
use threads;
sub worker {
my ($id) = @_;
print "Поток $id запущен\n";
sleep(2);
print "Поток $id завершен\n";
}
my @threads;
for my $i (1..3) {
push @threads, threads->create(\&worker, $i);
}
$_->join() for @threads;
Создание и управление потоками.
13.2 Потокобезопасные операции
#!/usr/bin/perl
use strict;
use warnings;
use threads;
use threads::shared;
my $counter :shared = 0;
my $lock :shared;
sub increment {
lock($lock);
$counter++;
print "Счетчик: $counter\n";
}
my @threads;
for (1..5) {
push @threads, threads->create(\&increment);
}
$_->join() for @threads;
Использование разделяемых переменных и блокировок.
14. Обработка ошибок
14.1 Try-Catch блок
#!/usr/bin/perl
use strict;
use warnings;
use Try::Tiny;
try {
die "Тестовая ошибка";
} catch {
print "Поймана ошибка: $_\n";
};
Обработка исключений с помощью Try::Tiny.
14.2 Пользовательские исключения
#!/usr/bin/perl
use strict;
use warnings;
use Exception::Class (
'MyException' => {
fields => [ 'message' ]
}
);
try {
MyException->throw(message => "Что-то пошло не так");
} catch {
if ($_->isa('MyException')) {
print "Ошибка: " . $_->message . "\n";
}
};
Создание и использование пользовательских исключений.
15. Работа с модулями
15.1 Создание модуля
# MyModule.pm
use strict;
use warnings;
package MyModule;
sub new {
my ($class) = @_;
return bless {}, $class;
}
sub hello {
print "Hello from MyModule!\n";
}
1;
# script.pl
use MyModule;
my $obj = MyModule->new();
$obj->hello();
Создание и использование собственного модуля.
15.2 Автозагрузка методов
package MyClass;
use strict;
use warnings;
use Carp;
our $AUTOLOAD;
sub new {
my ($class) = @_;
return bless {}, $class;
}
sub AUTOLOAD {
my $self = shift;
my $method = $AUTOLOAD;
$method =~ s/.*:://;
carp "Метод $method не существует";
}
1;
Реализация автозагрузки методов.
16. Работа с графикой
16.1 Создание изображения
#!/usr/bin/perl
use strict;
use warnings;
use GD;
my $image = GD::Image->new(200, 200);
my $white = $image->colorAllocate(255, 255, 255);
my $black = $image->colorAllocate(0, 0, 0);
my $red = $image->colorAllocate(255, 0, 0);
$image->filledRectangle(50, 50, 150, 150, $red);
$image->string(GD::Font->Giant, 60, 80, "Hello", $black);
open(my $fh, '>', 'image.png') or die "Не могу создать файл: $!";
print $fh $image->png;
close($fh);
Создание простого изображения с помощью модуля GD.
16.2 Обработка изображений
#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;
my $image = Image::Magick->new;
$image->Read('input.jpg');
$image->Resize(width => 800, height => 600);
$image->Rotate(degrees => 90);
$image->Write('output.jpg');
Изменение размера и поворот изображения с помощью Image::Magick.
17. Криптография
17.1 Шифрование данных
#!/usr/bin/perl
use strict;
use warnings;
use Crypt::CBC;
my $cipher = Crypt::CBC->new(
-key => 'my_secret_key',
-cipher => 'Blowfish'
);
my $plaintext = "Секретное сообщение";
my $ciphertext = $cipher->encrypt($plaintext);
print "Зашифрованный текст: $ciphertext\n";
my $decrypted = $cipher->decrypt($ciphertext);
print "Расшифрованный текст: $decrypted\n";
Шифрование и дешифрование данных с помощью Crypt::CBC.
17.2 Хеширование
#!/usr/bin/perl
use strict;
use warnings;
use Digest::SHA qw(sha256_hex);
my $text = "Пароль123";
my $salt = "random_salt";
my $hashed = sha256_hex($text . $salt);
print "Исходный текст: $text\n";
print "Хеш: $hashed\n";
Создание хеша с использованием SHA-256.
18. Тестирование
18.1 Модульные тесты
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
sub add {
my ($a, $b) = @_;
return $a + $b;
}
is(add(2, 3), 5, "2 + 3 = 5");
is(add(-1, 1), 0, "-1 + 1 = 0");
is(add(0, 0), 0, "0 + 0 = 0");
done_testing();
Написание простых модульных тестов с помощью Test::More.
18.2 Тестирование исключений
#!/usr/bin/perl
use strict;
use warnings;
use Test::Exception;
sub divide {
my ($a, $b) = @_;
die "Деление на ноль" if $b == 0;
return $a / $b;
}
lives_ok { divide(4, 2) } "Деление работает";
dies_ok { divide(4, 0) } "Деление на ноль вызывает исключение";
done_testing();
Тестирование исключений с помощью Test::Exception.
19. Работа с архивами
19.1 Создание ZIP архива
#!/usr/bin/perl
use strict;
use warnings;
use Archive::Zip;
my $zip = Archive::Zip->new();
$zip->addFile('file1.txt');
$zip->addFile('file2.txt');
$zip->addDirectory('folder/');
if ($zip->writeToFileNamed('archive.zip') == AZ_OK) {
print "Архив успешно создан\n";
} else {
print "Ошибка при создании архива\n";
}
Создание ZIP архива с несколькими файлами.
19.2 Распаковка архива
#!/usr/bin/perl
use strict;
use warnings;
use Archive::Extract;
my $ae = Archive::Extract->new(archive => 'archive.zip');
if ($ae->extract(to => 'extracted/')) {
print "Архив успешно распакован\n";
} else {
print "Ошибка при распаковке: " . $ae->error . "\n";
}
Распаковка ZIP архива в указанную директорию.
20. Продвинутые возможности
20.1 Метапрограммирование
#!/usr/bin/perl
use strict;
use warnings;
use Devel::Declare;
sub method :lvalue {
my ($name, $code) = @_;
no strict 'refs';
*{$name} = $code;
}
method 'greet' => sub {
my $self = shift;
print "Hello, $self->{name}!\n";
};
my $obj = { name => 'World' };
$obj->greet;
Пример метапрограммирования с использованием Devel::Declare.
20.2 Асинхронное программирование
#!/usr/bin/perl
use strict;
use warnings;
use Mojo::IOLoop;
Mojo::IOLoop->timer(2 => sub {
print "Прошло 2 секунды\n";
});
Mojo::IOLoop->timer(1 => sub {
print "Прошла 1 секунда\n";
});
Mojo::IOLoop->start;
Пример асинхронного программирования с использованием Mojo::IOLoop.
Это завершает коллекцию из 100 Perl скриптов. Каждый скрипт демонстрирует различные возможности языка Perl и может быть использован как отправная точка для более сложных проектов.