"Слишком много аргументов" при передаче массива в Perl sub? - программирование

"Слишком много аргументов" при передаче массива в Perl sub?

У меня есть функция ниже в perl

sub create_hash()
{
my @files = @_;

        foreach(@files){
         if(/.text/)
         {

         open($files_list{$_},">>$_") || die("This file will not open!");

         }
      }

}

Я вызываю эту функцию, передавая аргумент массива, как показано ниже:

create_hash( @files2);

В массиве содержится около 38 значений. Но я получаю ошибки компиляции:

Too many arguments for main::create_hash at ....

что я здесь делаю?

моя версия perl:

This is perl, v5.8.4 built for i86pc-solaris-64int
(with 36 registered patches, see perl -V for more detail)
4b9b3361

Ответ 1

Ваша проблема здесь:

sub create_hash()
{

() является prototype. В этом случае это означает, что create_hash не принимает никаких параметров. Когда вы пытаетесь передать его, Perl жалуется.

Он должен выглядеть как

sub create_hash
{

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

Ответ 2

Может использовать ссылку на массив как:

sub create_hash {
    my ($files) = @_;
    foreach(@{$files)){
      ...
    }
}

create_hash(\@files2);