MaxKonovalov38

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 и может быть использован как отправная точка для более сложных проектов.