Как я могу получить единственную часть хеша в Perl?

Отображаемые изображения на элементах линейных кнопок «получены» из исходного изображения (при рендеринге используются только значения альфа-канала, но на вашем изображении все выглядит нормально). Возможно, он просто не подходящего размера - вам может понадобиться открыть файл изображения и обрезать его до нужного размера.

Вы также можете попробовать посмотреть, можно ли использовать настройку свойства imageInsets (унаследованного UIBarButtonItem из UIBarItem ) для настройки размера в способ остановить его растяжение.

Doco на изображениях элементов панели говорит следующее:

Изображения, отображаемые на панели, получены из этого изображения. Если это изображение слишком велико, чтобы поместиться на панели, оно масштабируется, чтобы соответствовать. Как правило, размер изображения панели инструментов и панели навигации составляет 20 х 20 точек.

21
задан brian d foy 11 June 2009 в 12:01
поделиться

6 ответов

Срезы хэша возвращают значения, связанные со списком ключей. Чтобы получить хэш-фрагмент, вы меняете сигил на @ и предоставляете список ключей (в данном случае «a» и «b» ):

my @items = @hash{"a", "b"};

Часто вы можете использовать оператор слова кавычки для создания списка:

my @items = @hash{qw/a b/};

Вы также можете назначить хеш-срез, поэтому, если вам нужен новый хеш, содержащий подмножество другого хеша, вы можете сказать

my %new_hash;
@new_hash{qw/a b/} = @hash{qw/a b/};

Многие люди будут использовать map вместо хеш-фрагментов:

my %new_hash = map { $_ => $hash{$_} } qw/a b/;

Начиная с Perl 5.20.0, вы можете получить ключи и значения за один шаг, если вы используете% sigil вместо @ sigil:

my %new_hash = %hash{qw/a b/};
54
ответ дан 29 November 2019 в 06:20
поделиться

Вы Возможно, вы захотите составить список нужных вам ключей:

9
ответ дан 29 November 2019 в 06:20
поделиться

Еще один способ:

my @keys = qw(a b);
my %hash = (a => 1, b => 2, c => 3);
my %hash_copy;
@hash_copy{@keys} = @hash{@keys};
6
ответ дан 29 November 2019 в 06:20
поделиться

Слишком много функционального программирования заставляет меня сначала думать о zip .

С установленным List :: MoreUtils ,

use List::MoreUtils qw(zip);

%hash = qw(a 1 b 2 c 3);
@keys = qw(a b);
@values = @hash{@keys};
%hash = zip @keys, @values;

К сожалению, прототип List :: MoreUtils zip запрещает

zip @keys, @hash{@keys};

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

zip @keys, @{[@hash{@keys}]};

Или просто написать свой собственный zip без проблемных опытный образец. (Для этого вообще не нужен List :: MoreUtils.)

sub zip {
    my $max = -1;
    $max < $#$_and $max = $#$_ for @_;
    map { my $ix = $_; map $_->[$ix], @_; } 0..$max;
}

%hash = zip \@keys, [@hash{@keys}];

Если вы собираетесь изменять на месте,

%hash = qw(a 1 b 2 c 3);
%keep = map +($_ => 1), qw(a b);
$keep{$a} or delete $hash{$a} while ($a, $b) = each %hash;

избегает лишнего копирования, которое map и zip решения несут. (Да, изменение хеша во время итерации безопасно ... пока мутация удаляет только самую последнюю итерацию пары.)

При установленном List :: MoreUtils ,

use List::MoreUtils qw(zip);

%hash = qw(a 1 b 2 c 3);
@keys = qw(a b);
@values = @hash{@keys};
%hash = zip @keys, @values;

К сожалению, прототип List :: MoreUtils zip запрещает

zip @keys, @hash{@keys};

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

zip @keys, @{[@hash{@keys}]};

Или просто написать свой собственный zip без проблемного прототипа. (Для этого вообще не нужен List :: MoreUtils.)

sub zip {
    my $max = -1;
    $max < $#$_and $max = $#$_ for @_;
    map { my $ix = $_; map $_->[$ix], @_; } 0..$max;
}

%hash = zip \@keys, [@hash{@keys}];

Если вы собираетесь изменять на месте,

%hash = qw(a 1 b 2 c 3);
%keep = map +($_ => 1), qw(a b);
$keep{$a} or delete $hash{$a} while ($a, $b) = each %hash;

избегает лишнего копирования, которое map и zip решения несут. (Да, изменение хеша во время итерации безопасно ... пока мутация удаляет только самую последнюю итерацию пары.)

При установке List :: MoreUtils ,

use List::MoreUtils qw(zip);

%hash = qw(a 1 b 2 c 3);
@keys = qw(a b);
@values = @hash{@keys};
%hash = zip @keys, @values;

К сожалению, прототип List :: MoreUtils zip запрещает

zip @keys, @hash{@keys};

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

zip @keys, @{[@hash{@keys}]};

Или просто написать свой собственный zip без проблемного прототипа. (Для этого вообще не нужен List :: MoreUtils.)

sub zip {
    my $max = -1;
    $max < $#$_and $max = $#$_ for @_;
    map { my $ix = $_; map $_->[$ix], @_; } 0..$max;
}

%hash = zip \@keys, [@hash{@keys}];

Если вы собираетесь изменять на месте,

%hash = qw(a 1 b 2 c 3);
%keep = map +($_ => 1), qw(a b);
$keep{$a} or delete $hash{$a} while ($a, $b) = each %hash;

избегает лишнего копирования, которое map и zip решения несут. (Да, изменение хеша во время итерации безопасно ... пока мутация удаляет только самую последнюю итерацию пары.)

вы можете

zip @keys, @{[@hash{@keys}]};

Или просто написать свой собственный zip без проблемного прототипа. (Для этого вообще не нужен List :: MoreUtils.)

sub zip {
    my $max = -1;
    $max < $#$_and $max = $#$_ for @_;
    map { my $ix = $_; map $_->[$ix], @_; } 0..$max;
}

%hash = zip \@keys, [@hash{@keys}];

Если вы собираетесь изменять на месте,

%hash = qw(a 1 b 2 c 3);
%keep = map +($_ => 1), qw(a b);
$keep{$a} or delete $hash{$a} while ($a, $b) = each %hash;

избегает лишнего копирования, которое map и zip решения несут. (Да, изменение хеша во время итерации безопасно ... пока мутация удаляет только самую последнюю итерацию пары.)

вы можете

zip @keys, @{[@hash{@keys}]};

Или просто написать свой собственный zip без проблемного прототипа. (Для этого вообще не нужен List :: MoreUtils.)

sub zip {
    my $max = -1;
    $max < $#$_and $max = $#$_ for @_;
    map { my $ix = $_; map $_->[$ix], @_; } 0..$max;
}

%hash = zip \@keys, [@hash{@keys}];

Если вы собираетесь изменять на месте,

%hash = qw(a 1 b 2 c 3);
%keep = map +($_ => 1), qw(a b);
$keep{$a} or delete $hash{$a} while ($a, $b) = each %hash;

избегает лишнего копирования, которое map и zip решения несут. (Да, изменение хеша во время итерации безопасно ... пока мутация удаляет только самую последнюю итерацию пары.)

3
ответ дан 29 November 2019 в 06:20
поделиться

Хеш - это неупорядоченный контейнер, но термин срез действительно имеет смысл только в терминах упорядоченного контейнера. Возможно, изучите использование массива. В противном случае вам, возможно, придется просто удалить все элементы, которые вы не хотите создавать для своего «вспомогательного хеша».

-3
ответ дан 29 November 2019 в 06:20
поделиться

FWIW, здесь я использую Moose :: Autobox:

my $hash = { a => 1, b => 2, c => 3, d => 4 };
$hash->hslice([qw/a b/]) # { a => 1, b => 2 };

В реальной жизни я использую это для извлечения «имени пользователя» и «пароля» из отправки формы и передачи их в $ c-> Authenticate (который в моем случае ожидает хэш-ссылку, содержащую имя пользователя и пароль, но ничего больше).

3
ответ дан 29 November 2019 в 06:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: