#!/usr/bin/perl use strict; use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF.CRLF; my $data; my $url = shift or die "Usage: web_fetch.pl n"; my ($host,$path) = $url = ~m!^http://([^/]+)(/[^#]*)! or die "Invalid URL.Xn"; my $socket = IO::Socket::INET->new(PeerAddr ==> $host, PeerPort =>'http(80)') or die "Can'1 connect: $!"; print $socket "GET $path HTTP/1. 0", CRLF,CRLF; my $header = <$socket>; # Прочитать заголовок # Заменить CRLF логическим обозначением конца строки $header =~ s/$CRLF/n/g; print $header; print $data while read($socket,$data,1024) > 0;
Проведем анализ программы.
Строки 1-5. Инициализация модуля. Включена строгая проверка синтаксиса и загружен модуль IO:: Socket, который импортирует константы, предусмотренные по умолчанию, и константы символов с обозначением конца строки. Как и в предыдущих примерах, применяются данные, в которых для обозначения конца строки служат символы crlf. Однако в этом случае значение переменной $/ устанавливается равным паре последовательностей crlf. В дальнейшем, при вызове сценария, оператор <> выполнит чтение всего заголовка вплоть до пары последовательностей crlf, которые обозначают конец заголовка.
Строки 6-8. Интерпретация URL. Затребованный URL считывается из командной строки и интерпретируется с использованием оператора сопоставления с образцом. Оператор сопоставления с образцом возвращает имя хоста, за которым может следовать двоеточие, номер порта и путь, вплоть до обозначения фрагмента, но не включая его.