С visibility:hidden
объект все еще поднимает вертикальную высоту на странице. С display:none
это полностью удалено. Если у Вас будет текст под изображением, и Вы делаете display:none
, тот текст сместится для заполнения пространства, где изображение было. Если Вы сделаете visibility:hidden, то текст останется в том же месте.
Data :: Dumper - ваш друг.
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
выведет
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
Легко:
print "$_ $h{$_}\n" for (keys %h);
Элегантно, но на самом деле на 30% медленнее (!):
while (my ($k,$v)=each %h){print "$k $v\n"}
Ответ зависит от того, что находится в вашем хэше. Если у вас есть простой хеш, подойдет простой
print map { "$_ $h{$_}\n" } keys %h;
или
print "$_ $h{$_}\n" for keys %h;
, но если у вас есть хеш, заполненный ссылками, вы получите что-то, что может пройти по этим ссылкам и произвести разумный вывод. Такой обход ссылок обычно называют сериализацией. Существует множество модулей, реализующих разные стили, некоторые из наиболее популярных из них:
В связи с тем, что Data :: Dumper
является частью базовой библиотеки Perl, он, вероятно, является наиболее популярным; тем не менее, некоторые другие модули могут предложить очень хорошие вещи.
В целях отладки я часто использую YAML
.
use strict;
use warnings;
use YAML;
my %variable = ('abc' => 123, 'def' => [4,5,6]);
print "# %variable\n", Dump \%variable;
Результат:
# %variable
---
abc: 123
def:
- 4
- 5
- 6
В других случаях я буду использовать Data :: Dump
. Вам не нужно устанавливать столько переменных, чтобы он выводил его в удобном формате, чем для Data :: Dumper
.
use Data::Dump = 'dump';
print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }
Совсем недавно я использовал Data :: Принтер
для отладки.
use Data::Printer;
p %variable;
{
abc 123,
def [
[0] 4,
[1] 5,
[2] 6
]
}
(Результат может быть намного более красочным на терминале)
В отличие от других примеров, которые я показал здесь, этот предназначен только для отображения. Что легче обнаружится, если вы выгрузите структуру связанной переменной или структуры объекта.
use strict;
use warnings;
use MTie::Hash;
use Data::Printer;
my $h = tie my %h, "Tie::StdHash";
@h{'a'..'d'}='A'..'D';
p %h;
print "\n";
p $h;
{
a "A",
b "B",
c "C",
d "D"
} (tied to Tie::StdHash)
Tie::StdHash {
public methods (9) : CLEAR, DELETE, EXISTS, FETCH, FIRSTKEY, NEXTKEY, SCALAR, STORE, TIEHASH
private methods (0)
internals: {
a "A",
b "B",
c "C",
d "D"
}
}
Циклы:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
Функциональные
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
Но для чистой элегантности я бы выбрал wrang-wrang. Для своего собственного кода я бы выбрал свой foreach. Или использовать самосвал тетро.
По моему опыту, самый простой способ - просто использовать Dumpvalue .
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
Работает как шарм, и вам не нужно беспокоиться о форматировании хэша, так как он выводит его как отладчик Perl делает (отлично подходит для отладки). Кроме того, Dumpvalue включен в стандартный набор модулей Perl, поэтому вам не придется возиться с CPAN, если вы используете какой-то драконовский прокси (например, я на работе).
Если вы хотите быть педантичным и придерживаться одной строчки (без выражений использования и shebang), то я как бы откатываю от ответа тетромино и предлагаю:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
Не делаю ничего особенного, кроме использования анонимного хэша для пропуска временной переменной;)