Вы могли бы думать, что можно сделать это для сохранения памяти:
@is_month{qw(jan feb mar apr may jun jul aug sep oct nov dec)} = undef;
print "It's a month" if exists $is_month{lc $mon};
но это не делает этого. Perl все еще присваивает другую скалярную величину каждому ключу. Devel:: Быстрый взгляд показывает это. PVHV
хеш. Elt
ключ и SV
это следует, его значение. Обратите внимание, что каждый SV имеет различный адрес памяти, указывающий, что они не совместно используются.
Dump \%is_month, 12;
SV = RV(0x81c1bc) at 0x81c1b0
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x812480
SV = PVHV(0x80917c) at 0x812480
REFCNT = 2
FLAGS = (SHAREKEYS)
ARRAY = 0x206f20 (0:8, 1:4, 2:4)
hash quality = 101.2%
KEYS = 12
FILL = 8
MAX = 15
RITER = -1
EITER = 0x0
Elt "feb" HASH = 0xeb0d8580
SV = NULL(0x0) at 0x804b40
REFCNT = 1
FLAGS = ()
Elt "may" HASH = 0xf2290c53
SV = NULL(0x0) at 0x812420
REFCNT = 1
FLAGS = ()
undef скаляр берет столько же памяти сколько целочисленный скаляр, таким образом, Вы могли бы попросить хорошо просто присваиваться им всем к 1 и избегать прерывания упущения свериться exists
.
my %is_month = map { $_ => 1 } qw(jan feb mar apr may jun jul aug sep oct nov dec);
print "It's a month" if $is_month{lc $mon});
Вы можете установить свойство KeepWith
таблицы Row
, чтобы указать блоки, которые должны храниться вместе.
Если вы знаете, что таблица подходит на одной странице для свойства KeepWith
первой строки можно установить значение (table.Rows.Count - 1)
, когда таблица будет завершена.