Доступ к элементам массива переданного хэша - PullRequest
0 голосов
/ 25 октября 2011

У меня есть два хэша с указанием Folderame в качестве ключа и соответствующих файлов в виде массива.Но я не могу получить доступ к элементам массива переданного хэша в подпрограмме getMissingFiles (см. Комментарии об ошибках).

Хэши для сравнения:

# contains all files
%folderWithFiles1 =
(
    foldername1 => [ qw(a b c d e f g h i j k l m n o p) ],
    foldername2 => [ qw(a b c d e f g h i j k l m n ) ],
)

%folderWithFiles2 =
(
    foldername1 => [ qw(a b d e h i l m n p) ],
    foldername2 => [ qw(a d f g h j m ) ],
)

Сравнить подпрограмму (получить пропущенные файлы изhash2, которых нет в hash1):

sub getMissingFiles()
{
    my ($hash1, $hash2) = shift; # is it working?
    #my $hash1 = shift; # or do you have to do it separately?
    #my $hash2 = shift;
    my $flag = 0;
    my @missingFiles;

    foreach my $folder (sort(keys %{$hash1}))# (sort(keys %hash1)) not possible?
    {
        for (my $i = 0; $i < @$hash1{$folder}; $i++)
        {
            foreach my $folder2 (sort(keys %{$hash2}))
            {
                foreach my $file2 (@$hash2{$folder2})
                {
                    if ($hash1{$folder}[$i] == $file2) # Error: Global symbol "%hash1" requires explicit package name
                    {
                        $flag = 1;
                        last;
                    }
                }
                if (0 == $flag)
                {
                    push(@missingFiles, $hash1{$folder}[$i]); # Error: Global symbol "%hash1" requires explicit package name
                }
                else
                {
                    $flag = 0;
                }
            }
        }
    }
    return @missingFiles;
}

Вызов функции:

@missingFiles = &getMissingFiles(\%hash1, \%hash2);
  • Is: "my ($ hash1, $ hash2) = shift;"исправить или вам нужно сделать это отдельно?
  • Почему «foreach my $ folder (sort (keys% hash1))» невозможно?
  • Есть ли более эффективный способ, чем использование 4петли?

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Этот синтаксис вызова не совсем правильный - вы хотите

my ($hash1, $hash2) = @_;

или, возможно,

my $hash1 = shift;
my $hash2 = shift;

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

1 голос
/ 25 октября 2011

В getMissingFiles (), так же как вы разыменовываете $hash1 и $hash2, чтобы получить ключи, вам также нужно разыменовать их, чтобы получить значения:

@folder_files = @{ $hash1->{$folder1} }; 

или, альтернативно,

@folder_files = @{ $$hash1{$folder} };

И вы можете сделать это, чтобы получить отдельные файлы:

$file = $hash1->{$folder}[$i];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...