Что означает синтаксис Perl <$ VARIABLE>? - PullRequest
0 голосов
/ 29 декабря 2018

Просто не могу найти, что делает этот синтаксис (<$SOCKET>), хотя я предполагаю, что это какая-то оценка или поведение по умолчанию для объекта внутри переменной.

Я пытался протестировать свой Apacheсервер (после установки модуля mod_evasive ) с этим предполагаемым зондом DoS (это происходит внутри 100-кратного цикла), но он всегда возвращает ответ 400 Bad Request .Пытаясь расшифровать код, я застрял в закомментированной строке ниже.

use IO::Socket;
use strict;

my($response);
my($SOCKET) = new IO::Socket::INET( Proto   => "tcp",
                                  PeerAddr=> "127.0.0.1:80");
if (! defined $SOCKET) { die $!; }
print $SOCKET "GET / HTTP/1.1\n\n";

$response = <$SOCKET>; ## What are those < > signs???

print $response;
close($SOCKET);

Тогда основной интерес у меня заключается в том, чтобы иметь возможность играть в тест, поэтому мне нужно знать, прежде всего,почему я получаю код ошибки 400, чтобы исправить это.

Но также, кстати, ради любопытства я хотел бы понять значение синтаксиса <$SOCKET>, потому что я нигде не могу найти его объяснение.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018
  • <> означает readline(ARGV)
  • <IDENTIFIER> означает readline(IDENTIFIER)
  • <$IDENTIFIER> означает readline($IDENTIFIER)
  • <...> (что угодноelse) означает glob(qq<...>)

Вы используете третий синтаксис, поэтому <$SOCKET> означает readline($SOCKET).Вы используете его в скалярном контексте, поэтому он читает строку из $SOCKET.

0 голосов
/ 29 декабря 2018

< > (также известный как «оператор бриллиантов») - сокращение от readline.Вещи внутри скобок обеспечивают строки ввода.Это может быть дескриптор файла, канал, сокет или что-то подобное.В вашем случае это переменная $SOCKET, в которой хранится созданный вами сокет.

Вызов <$SOCKET> читает следующую строку из этого ввода.

Хотя здесь есть небольшая хитрость,В некоторых других случаях < > является сокращением для glob.Если объект внутри углов выглядит как шаблон с глобусом, < > возвращает список файлов, которые соответствуют этому шаблону:

 my @files = <*.txt>;

Это какой-то старый синтаксис, который вы можете увидеть;Я предпочитаю изложить это, хотя:

 my @files = glob( '*.txt' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...