В чем причина этой ошибки при использовании sockaddr_in () в Perl? - PullRequest
1 голос
/ 13 марта 2019

Эта проблема почти свела меня с ума (работает в отладчике Perl):

  DB<3> x sockaddr_in(123, inet_aton('localhost'))
usage:   (port,iaddr) = sockaddr_in(sin_sv) at (eval 7)[/usr/lib/perl5/5.18.2/perl5db.pl:732] line 2.

Тем не менее:

  DB<10> x $a = sockaddr_in(123, inet_aton('localhost'))
0  "\cB\c@\c@{\c?\c@\c@\cA\c@\c@\c@\c@\c@\c@\c@\c@"

Это единственный известный мне пример, когда я не могу напечатать результат вызова функции непосредственно в отладчике Perl (но только после того, как он назначен переменной).

Также это единственная из известных мне функций, которая выдает ошибку использования при вызове с правильными параметрами.

Кто может объяснить?

1 Ответ

2 голосов
/ 13 марта 2019

Это не проблема с отладчиком, это предупреждение, выдаваемое sockaddr_in, когда оно используется с двумя аргументами в контексте списка.

$ perl -MSocket -wE 'say length(sockaddr_in(123,inet_aton("localhost")))'
16

$ perl -MSocket -wE 'say sockaddr_in(123,inet_aton("localhost"))'
usage:   (port,iaddr) = sockaddr_in(sin_sv) at -e line 1.

sockaddr_in имеет два синтаксиса вызова. Он может преобразовать неупакованный порт и адрес в адрес упакованного сокета (преобразование списка из двух элементов в скаляр) или преобразовать адрес упакованного сокета в порт и адрес (преобразование скаляра в список из двух элементов).

$sockaddr = sockaddr_in($port,$ip_address);
($port,$ip_address) = sockaddr_in($sockaddr);

Он может сказать, какая операция запрашивается по количеству аргументов, переданных функции, и по контексту вызова функции, и предупреждает, когда эти два несовместимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...