Perl: сохранить хеш-ссылки в хеш для Image :: ExifTool - PullRequest
0 голосов
/ 22 марта 2019

Попытка в течение двух дней сохранить все читаемые (недвоичные) выходные данные ExifTool в хеш с ключом к пути к файлам:

use strict;
use warnings;
use Image::ExifTool;
use Data::Types qw(:all);
use v5.28;

my @directories = ("/some/filepath/to-pictures");
my @suffixes = qw(jpg jpeg gif png raw svg tif tiff psd orf nef eps cr2 arw);

my %file_catalog = ();
while (my $folder = shift @directories) {

    opendir(DirHandle, "$folder") or die "Cannot open $folder\n";
    my @files = readdir(DirHandle);
    closedir(DirHandle);

    foreach my $file (@files) {
        my $file_string = "$folder/$file";
        if (-f $file_string) {
            my $sep_pos = rindex($file, ".");
            my $end_chars = -($sep_pos - (length $file) + 1);
            my $suffix = substr $file, $sep_pos + 1, $end_chars;
            if (grep ( lc $suffix, @suffixes)) {
                my $exif_tool = new Image::ExifTool;
                my $info = $exif_tool->ImageInfo($file_string);
                say "Datei: $file_string";
                %file_catalog = ($file_string => $info);
                foreach (keys %{$info}) {
                    say "Key: $_ => Value: $$info{ $_ }";
                }
            }
        }
    }
}

Также не работает: %file_catalog = ($file_string => %{$info});.

Но я либо не получаю более одной информации о снимке в моем %file_catalog - вы можете мне это объяснить?

Или у меня много проблем с разыменованием ("Can't use string as a HASH ref while "strict refs" in use") или сохранение ("Odd number of elements in hash assignment"), как вы можете видеть в моей истории коммитов repo .

Конечно, не все изображения имеют одинаковую exif-информацию, каждое изображение имеет разные ключи-> значения.

Для тестового вывода:

my $hash_size = keys %file_catalog;
print "\n---------------------------\n";
print "In 'file_catalog'-hash recorded image-path (key)-/ exif-data (value)-hashes: ", $hash_size;
print "\n---------------------------\n";

my ($i, $j) = 0;
foreach my $key (sort keys %file_catalog) {
    $i++;
    printf "%s. key: $key\n", uc chr($i + ord('A') - 1 );
    foreach my $inner_key (keys %{$file_catalog{ $key }}) {
        $j++;
        say "$j. inner key: $inner_key: $file_catalog{$key}{$inner_key}";
    }
}

Может быть, кто-то может помочь мне понять.Также, возможно, есть лучшая конструкция, чем мой код неофита.

1 Ответ

1 голос
/ 22 марта 2019

Чтобы добавить новое значение ключа в хеш, вам нужно:

$file_catalog{$file_string} = $info;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...