Готовая программа

#!/usr/bin/perl

use warnings;
use utf8;
use Getopt::Long qw/:config no_ignore_case bundling/;
use IO::File;
use Encode;
use open IO=>':locale';
use open ':std';

sub help()
{
	STDERR->print(<<__HELP__);
textformat.pl ⟨опции⟩ ⟨файл⟩

⟨опции⟩:
	-w, --width ⟨число⟩
		ширина текста (75 по умолчанию)
	-o, --output-file ⟨файл⟩
		выходной файл
		(«-» означает стандартный вывод, по умолчанию)
	-h, --help
		показать эту подсказку

⟨файл⟩:
	входной файл
	(«-» означает стандартный ввод, по умолчанию)
__HELP__
	exit;
}

my $width=75;
my $outputFileName='-';

GetOptions
	(
		'w|width=i'=>\$width,
		'o|output-file=s'=>\$outputFileName,
		'h|help!'=>\&help,
	)
	or warn "Ошибка в опциях командной строки.\n\n" and help();

my $line='';
my $word='';
my $lastChar="\n";

my $inputFileName=shift//'-';

my $in=($inputFileName eq '-')? STDIN: IO::File->new($inputFileName, '<:utf8')
	or die "$0: Невозможно открыть файл «$inputFileName» для чтения: ",
		decode_utf8($!), "\n";
my $out=($outputFileName eq '-')? STDOUT: IO::File->new($outputFileName, '>:utf8')
	or die "$0: Невозможно открыть файл «$outputFileName» для записи: ",
		decode_utf8($!), "\n";

while(defined(my $char=$in->getc))
{
	if($lastChar eq "\n")
	{
		if($char eq "\n")
		{
			if($line eq '')
			{
				$out->print("\n");
			}
			else
			{
				$out->print("$line\n\n");
			}
			$line='';
		}
		elsif($char ne ' ')
		{
			$word.=$char;
		}
	}
	elsif($lastChar ne ' ')
	{
		if($char ne ' ' and $char ne "\n")
		{
			$word.=$char;
		}
		else
		{
			if($line eq '')
			{
				$line=$word;
			}
			elsif(length($line)+length($word)<$width)
			{
				$line.=" $word";
			}
			else
			{
				$out->print("$line\n");
				$line=$word;
			}
			$word='';
		}
	}
	else
	{
		$word=$char if $char ne ' ' and $char ne "\n";
	}
	$lastChar=$char;
}

$out->print("$line\n");
Информатика-54© А. Н. Швец