2015-09-03 2 views
4

Я пытаюсь подключиться к 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

+4

<$socket> будет действовать по-разному в зависимости от контекста. Вызов дескриптора в скалярном контексте возвращает вам следующую строку из дескриптора. Вызов дескриптора в контексте списка вернет вам каждую строку. Print - это контекст списка, в котором при назначении скаляру используется контекст масштабирования. –

+3

попробуйте 'my $ content = join ('', <$socket>);'. Join будет читать '<$socket>' в контексте списка, затем присоединяйте каждую строку вместе и верните одну строку, которая затем может быть назначена вашей скалярной переменной. –

ответ

2

Комментарий Крис Дойл является решением этой проблемы:

<$socket> будет действовать по-разному в зависимости от контекста. Вызов дескриптора в скалярном контексте возвращает вам следующую строку из дескриптора . Вызов дескриптора в контексте списка вернет вам каждую строку . Print - это контекст списка, в котором при назначении скаляру используется масштабирующее выражение . - Chris Doyle 10 мин. Назад

попытка my $content = join('',<$socket>);. Join будет читать <$socket> в списке контекста, затем присоедините каждую строку вместе и верните одну строку, , которая затем может быть отнесена к вашей скалярной переменной. - Chris Doyle 8

+1

Или: 'my $ content; {local $ /; $ content = <$socket>; } ' – ikegami

Смежные вопросы