Передача строки и ссылки на хэш в подпрограммы - PullRequest
1 голос
/ 05 июля 2019

Я передаю строку и хеш в подпрограмму, где хеш принимается как ссылка на подпрограмму. В конце вызова подпрограммы я ожидаю, что мой хеш будет заполнен. Снимок:

#!/usr/local/bin/perl5.8

sub passHashAndFile {
  my ($file, $hashRef) = @_;
  open(HANDLE, $file) or die("Can not open file $file \n");
    while(<HANDLE>) {
      my @splitted_values = split("--", $_);
      $hashRef->{$spllited_values[0]} = $hashRef->{$spllited_values[1]};
    }
  close(HANDLE);
}

my %hash;
passHashAndFile("test.txt", %hash);
foreach my $elem (keys %hash) {
  print "Key = $elem, Value = $hash{$elem}\n";
}

И мой test.txt выглядит так:

1--2
3--4
5--6
7--8

Я перехватываю хеш в качестве ссылки, а затем разыменую его для заполнения значений. Что плохого он сделал?

1 Ответ

4 голосов
/ 05 июля 2019
passHashAndFile("test.txt", %hash);

должно быть

passHashAndFile("test.txt", \%hash);

Кроме того, у вас есть имена переменных с ошибками, вы присваиваете неверное значение, вы используете нелокализованные глобальные переменные и используете проблемный 2-аргумент open. Кроме того, большинство людей имеют подпрограмму, возвращающую ссылку на хэш вместо ссылки на пустой хэш.

#!/usr/local/bin/perl5.8

use strict;
use warnings;

sub parse_file {
   my ($qfn) = @_;
   open(my $fh, '<', $qfn)
      or die("Can't open file \"$qfn\": $!\n");

   my %hash;
   while (my $line = <$fh>) {
      my ($key, $val) = split(/--/, $line);
      $hash{$key} = $val;
   }

   return \%hash;
}

my $hash = parse_file("test.txt");
for my $key (keys %$hash) {
   print "Key = $key, Value = $hash->{$key}\n";
}

Мы обычно исключаем наши ответы, но всегда используем use strict; use warnings;. Он нашел бы хотя бы одну из проблем.

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