Здравствуйте, elar, Вы писали:
E>$socket = IO::Socket::INET->new(PeerAddr => "mysite:80"); E>($uploadserver) = <$socket> =~ /\r\n\r\n(\d+)/;
E>Если возможно переведите на C#. Или объясните, что означает 2-я строка. Заранее благодарен. E>(P.S. perl-недружелюбный язык. Особенно,когда его не знаешь. )
ЕМНИП разбираем вторую строку:
<$socket> — читаем из сокета все что там есть
=~ — натравляем шаблон на данные
<$socket> =~ /\r\n\r\n(\d+)/;
прочитанное разбиваем по шаблону — ищем двойной перевод строки за которым следуют цифры (они нам и нужны)
результат присваиваем ($uploadserver). А в скобках — чтобы присвоился не массив а первое значение из массива
Если возможно переведите на C#. Или объясните, что означает 2-я строка. Заранее благодарен.
(P.S. perl-недружелюбный язык. Особенно,когда его не знаешь. )
Здравствуйте, elar, Вы писали:
E>Помогите разобраться с кодом (perl)
E>$socket = IO::Socket::INET->new(PeerAddr => "mysite:80"); E>($uploadserver) = <$socket> =~ /\r\n\r\n(\d+)/;
E>Если возможно переведите на C#. Или объясните, что означает 2-я строка. Заранее благодарен.
<$socket> — чтение из сокета построчное (функция readline). Далее к результату применяется проверка по шаблону, по которой вылавливается одно число после двух CRLF подряд — насколько я понимаю, это ответ сервера... (тут непонятно алгоритмически — если порт 80, значит, HTTP, и надо было ещё запрос дать — Вы его скипнули?) Если это HTTP, то число — значение первой строчки тела ответа (потому что два CRLF — это конец заголовка и разделитель заголовка с телом). И в итоге оно (число) записывается в переменную $uploadserver.
E>(P.S. perl-недружелюбный язык. Особенно,когда его не знаешь. :xz: )
Ну в таком стиле особенно. Я на перле пишу, но стараюсь подобного не применять. Но есть любители лаконичности...
Здравствуйте, netch80, Вы писали:
E>>($uploadserver) = <$socket> =~ /\r\n\r\n(\d+)/; N>Я на перле пишу, но стараюсь подобного не применять. Но есть любители лаконичности...
Зачем в таком случае использовать Perl?!
По-моему, это вполне безобидная конструкция, не засоренная императивным оверхедом.
Еще при желании можно так:
$uploadserver = $1 if <$socket> =~ /\r\n\r\n(\d+)/;
но это уже вылез if.
Кстати, если $/ != undef, то <$socket> выдаст только одну очередную строчку, верно?
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, netch80, Вы писали:
E>>>($uploadserver) = <$socket> =~ /\r\n\r\n(\d+)/; N>>Я на перле пишу, но стараюсь подобного не применять. Но есть любители лаконичности...
RO>Зачем в таком случае использовать Perl?!
Удобно для мелких скриптов.
RO>По-моему, это вполне безобидная конструкция, не засоренная императивным оверхедом.
Как ты определяешь, как именно выполняется здесь readline — скалярно одну строку, скалярно весь файл или списочно? А почему именно так?
RO>Еще при желании можно так: RO>
$uploadserver = $1 if <$socket> =~ /\r\n\r\n(\d+)/;
RO>но это уже вылез if.
RO>Кстати, если $/ != undef, то <$socket> выдаст только одну очередную строчку, верно?
N>Как ты определяешь, как именно выполняется здесь readline — скалярно одну строку, скалярно весь файл или списочно? А почему именно так?
Это от контекста зависит и $/. Контекст здесь скалярный, так что либо весь текст в одну строку, либо первая строка. Что именно — зависит от $/. undef там не видно, но с другой стороны, первая строчка не начинается с переводов строк...
Здравствуйте, Vamp, Вы писали:
N>>Как ты определяешь, как именно выполняется здесь readline — скалярно одну строку, скалярно весь файл или списочно? А почему именно так? V>Это от контекста зависит и $/.
Не надо рассказывать детали. Понятно, что их можно найти. Вопрос в том, насколько легко и быстро это всё вспоминается при чтении кода. А вот с этим у перла проблемы.
Потому я написал "Как ты определяешь", а не "какой контекст". Но, видимо, народ у нас привык читать только каждое третье слово.