Я пытаюсь подключиться к URL-адресу https, чтобы сохранить ответ на строку.Сохранить ответ сокета на строку в Perl
use strict;
use warnings;
use IO::Socket::SSL;
my $socket = IO::Socket::SSL->new(
PeerHost => "google.com",
PeerPort => "https"
) or die "Error: $!";
print $socket "GET/HTTP/1.0\r\n\r\n";
my $content = <$socket>;
print $content;
print "length: ";
print length($content);
print "\n";
close $socket;
Выход только первая строка HTTP Response:
HTTP/1.0 302 Found
length: 20
Когда я изменить сценарий и напечатать ответ с «печать», выход полный repsonse:
use strict;
use warnings;
use IO::Socket::SSL;
my $socket = IO::Socket::SSL->new(
PeerHost => "google.com",
PeerPort => "https"
) or die "Error: $!";
print $socket "GET/HTTP/1.0\r\n\r\n";
print <$socket>;
close $socket;
Выход:
HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: https://www.google.de/?gfe_rd=cr&ei=XAroVeuYDMWo8wfioYKQBw
Content-Length: 259
Date: Thu, 03 Sep 2015 08:52:44 GMT
Server: GFE/2.0
Alternate-Protocol: 443:quic,p=1
Alt-Svc: quic=":443"; p="1"; ma=604800
<HTML>...</HTML>
Я не понимаю, почему я не могу сохранить ответ сокета на строку.
Я использую PERL v5.14.2
<$socket> будет действовать по-разному в зависимости от контекста. Вызов дескриптора в скалярном контексте возвращает вам следующую строку из дескриптора. Вызов дескриптора в контексте списка вернет вам каждую строку. Print - это контекст списка, в котором при назначении скаляру используется контекст масштабирования. –
попробуйте 'my $ content = join ('', <$socket>);'. Join будет читать '<$socket>' в контексте списка, затем присоединяйте каждую строку вместе и верните одну строку, которая затем может быть назначена вашей скалярной переменной. –