Почему Perl уничтожает мой массив? - PullRequest
6 голосов
/ 02 декабря 2008

Вот короткая тестовая программа:

sub foo($;@) {
  my $sql = shift;
  my @params = @_;

  print "sql: $sql\n";
  print "params: " . join(",", @params);
}

sub bar($;@) {
  foo(@_);
}

bar("select * from blah where x = ? and y = ?",2,3);
print "\n";

Почему вывод такой:

sql: 3
params: 

Вместо этого?

sql: select * from blah where x = ? and y = ?
params: 2,3

Ответы [ 3 ]

20 голосов
/ 02 декабря 2008

Это потому, что когда вы вызываете foo(@_), прототип для foo() заставляет первый параметр (который является массивом) преобразовываться в скаляр (который является числом элементов в @_).

См. Ответы на мой предыдущий вопрос с вопросом " Почему прототипы функций Perl плохие "?

FWIW, вы можете сохранить прототипы на месте, если вы измените bar таким образом:

sub bar($;@) {
    foo(shift, @_);
}
10 голосов
/ 02 декабря 2008

Вы неправильно понимаете прототипы Perl. Удалите их, и все будет хорошо.

См .: Почему прототипы функций Perl 5 плохи?

5 голосов
/ 02 декабря 2008

избавьтесь от ($;@) после имен ваших функций, и это прекрасно работает.

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