Невозможно передать хеш и строку в функцию вместе в perl! - PullRequest
4 голосов
/ 25 августа 2010

Я в основном пытаюсь передать строку и хэш подпрограмме в perl.

sub coru_excel {
    my(%pushed_hash, $filename) = @_;
    print Dumper(%pushed_hash);
}

Но похоже, что данные перепутаны. Сброшенные данные также включают $filename. вот вывод.

...................
$VAR7 = 'Address';
$VAR8 = [
          '223 VIA DE
................
        ];
$VAR9 = 'data__a.xls'     <----- $filename
$VAR10 = undef;
$VAR11 = 'DBA';
$VAR12 = [
           'J & L iNC
..................
         ];

Вот как я назвал подпрограмму.

coru_excel(%hash, "data_".$first."_".$last.".xls");

Ответы [ 5 ]

10 голосов
/ 25 августа 2010

Аргументы передаются подпрограммам как один недифференцированный список.

Одним из решений является изменение порядка аргументов так, чтобы скаляр был первым.

sub coru_excel {
    my($filename, %pushed_hash) = @_;
}

coru_excel("FILE_NAME", %hash);

Другой подход - передать хеш по ссылке:

sub coru_excel {
    my($pushed_hash_ref, $filename) = @_;
}

coru_excel(\%hash, "FILE_NAME");
6 голосов
/ 25 августа 2010

Вы можете передать хеш как ссылку:

sub coru_excel {
    my($pushed_hashref, $filename) = @_;
    print Dumper(%$pushed_hashref);
}

coru_excel(\%my_hash, $file);

Или перед инициализацией хеша вы могли бы получить специальную обработку последнего аргумента:

sub coru_excel {
    my $filename = pop @_;
    my(%pushed_hash) = @_;
    print Dumper(%pushed_hash);
}
5 голосов
/ 25 августа 2010

Вы должны передать хеш как ссылку:

coru_excel(\%hash, "data_".$first."_".$last.".xls");

Вы используете это так:

sub coru_excel {
    my($pushed_hash_ref, $filename) = @_;
    my %pushed_hash = %{$pushed_hash_ref};

    print Dumper(%pushed_hash); # better: \%pushed_hash or $pushed_hash_ref
}

См. perlreftut для руководства по ссылкам и perlref для получения дополнительной информации.

Dumper также создает полезную информацию, когда вы передаете ссылку на хеш (или массив).

3 голосов
/ 25 августа 2010

См. Также FAQ по Perl. Из командной строки:

perldoc -q pass

или

perldoc -q hash

См. perlfaq7 : Как передать / вернуть {Function, FileHandle, Array, Hash, Method, Regex}?

2 голосов
/ 25 августа 2010

Небольшая программа, демонстрирующая, как это сделать, используя опорную нотацию при передаче хеша и сдвига в подпрограмме для извлечения параметров.

#!/usr/bin/perl -w
use strict;
sub coru_excel(%$);
my %main_hash = ('key1' => 'val1', 'key2' => 'val2');
my $first = "ABC";
my $last = "xyz";
coru_excel(\%main_hash, "data_" . $first . "_" . $last . ".xls");
exit;

sub coru_excel(%$)
{
    my %passed_hash = %{(shift)};
    my $passed_string = shift;
    print "%passed_hash:\n";
    for my $k (keys %passed_hash) {
        print "  $k => $passed_hash{$k}\n";
    }
    print "\$passed_string = $passed_string\n";
    return;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...