Неинициализированное хеширует ключ, имеют значение по умолчанию нуля в Perl?

Вы неправильно понимаете значение is_active . Это поле используется Django, чтобы определить, разрешено ли пользователю входить в систему , а не входить в него в этот момент или нет.

Даже если вы захотите создать собственное поле User для хранения этой информации, это будет трудно сделать, так как сессия истекает просто по прошествии времени. На сервере на самом деле ничего не происходит, что могло бы вызвать изменение в поле модели.

Итак, если вам нужно определить всех вошедших в систему пользователей, вам нужно использовать хранилище сеансов. Джанго не предлагает простой способ сделать это, но это, безусловно, возможно. Этот ответ показывает, как запросить таблицу Session, чтобы выяснить, кто вошел в систему.

8
задан Brad Gilbert 1 May 2009 в 17:03
поделиться

4 ответа

The value is not automatically zero. The value is undefined initially. However, if you treat it like a number (eg, apply ++ to it), then Perl treats it like zero. If you treat it like a string (eg, apply . to it), then Perl treats it like an empty string.

From perldoc perlsyn, under 'Declarations':

The only things you need to declare in Perl are report formats and subroutines (and sometimes not even subroutines). A variable holds the undefined value ("undef") until it has been assigned a defined value, which is anything other than "undef". When used as a number, "undef" is treated as 0; when used as a string, it is treated as the empty string, ""; and when used as a reference that isn’t being assigned to, it is treated as an error.

26
ответ дан 5 December 2019 в 04:58
поделиться

To elaborate on Telemachus' post, the uninitialized values will be undefined. The deep parts of the structure are autovivified. This is a handy feature where data structures are created for you automatically. Autovivification is great when you want it, but it can be a pain when you want to prevent it. There are many tutorials, articles and posts around the net on understanding autovivification.

So given an undefined $ref and $ref->{ipv6}{pa}{'foo'}++, $ref will be assigned a value of:

$ref = { 
     ipv6 => { 
          pa => { 
              foo => undef
          }
     }
};

Then the undef will be incremented, since undef numifies to 0, we get 0++ which is 1. Для окончательного результата: ref -> {ipv6} {pa} {'foo'} == 1 .

Если у вас включены предупреждения, (вы используете предупреждения; , не так ли?) вы получите предупреждение «неинициализированное значение», когда оперируете этими неопределенными значениями. Если желаемое поведение заключается в увеличении унифицированного значения, то вы можете отключить нужную группу предупреждений для ограниченной части вашего кода:

use strict;
use warnings;
my $res;

// run query to fetch IPv6 resources
while( my $row = $org_ip6_res->fetchrow_arrayref )
{   no warnings 'uninitialized';
    if( $row->[4] =~ /PA/ ) {
        $res->{ipv6}{pa}{$row->[2]}++;
    } elsif( $row->[4] eq 'PI' ) {
        $res->{ipv6}{pi}{$row->[2]}++;
    }
}

Вы можете найти иерархию предупреждений в perllexwarn .

5
ответ дан 5 December 2019 в 04:58
поделиться

It's basically undefined, but treated as if it was zero when you increment it.

The term in Perl parlance is 'autovivified'.

What you probably want to do is use the exists keyword:

$res->{ipv6}{pa}{$row->[2]}++ if exists($res->{ipv6}{pa}{$row->[2]});
4
ответ дан 5 December 2019 в 04:58
поделиться

Не существует такого понятия, как неинициализированный хэш-ключ . То, что может быть неинициализировано, это значение для определенного ключа. Значение хеша это просто скалярное значение; она ничем не отличается от такой переменной, как $ foo .

В вашем примере есть несколько различных функций Perl, взаимодействующих.

Изначально $ res не определено (то есть имеет значение undef ). Когда вы используете неинициализированное значение в качестве ссылки на хэш (как в $ res -> {ipv6} ... ), Perl «автоматически оживляет» его как единое целое. То есть Perl создает анонимный хеш и заменяет значение undef ссылкой на новый хеш. Этот процесс повторяется (тихо) каждый раз, когда вы используете результирующее значение в качестве ссылки.

В конце концов, вы автоматически выбираете путь к $ res -> {ipv6} {pa} {$ row -> [2]} , который не определен. Помните, что это просто скалярное значение типа $ foo . Поведение аналогично сказанному

my $foo;
$foo++;

Perl делает особые вещи, когда вы используете неопределенные значения. Если вы используете их как число, Perl преобразует их в 0. Если вы используете их как строку, Perl преобразует их в '' (пустая строка). В большинстве случаев вы получите предупреждение «Использовать неинициализированное значение ...», если у вас включены предупреждения (что вам следует). Тем не менее, оператор с автоинкрементом ( ++ ) является частным случаем. Для удобства он тихо преобразует значение из undef в 0 перед его увеличением.

Помните, что это просто скалярное значение типа $ foo . Поведение аналогично сказанному

my $foo;
$foo++;

Perl делает особые вещи, когда вы используете неопределенные значения. Если вы используете их как число, Perl преобразует их в 0. Если вы используете их как строку, Perl преобразует их в '' (пустая строка). В большинстве случаев вы получите предупреждение «Использовать неинициализированное значение ...», если у вас включены предупреждения (что вам следует). Тем не менее, оператор с автоинкрементом ( ++ ) является частным случаем. Для удобства он тихо преобразует значение из undef в 0 перед его увеличением.

Помните, что это просто скалярное значение типа $ foo . Поведение аналогично сказанному

my $foo;
$foo++;

Perl делает особые вещи, когда вы используете неопределенные значения. Если вы используете их как число, Perl преобразует их в 0. Если вы используете их как строку, Perl преобразует их в '' (пустая строка). В большинстве случаев вы получите предупреждение «Использовать неинициализированное значение ...», если у вас включены предупреждения (что вам следует). Тем не менее, оператор с автоинкрементом ( ++ ) является частным случаем. Для удобства он тихо преобразует значение из undef в 0 перед его увеличением.

Если вы используете их как число, Perl преобразует их в 0. Если вы используете их как строку, Perl преобразует их в '' (пустая строка). В большинстве случаев вы получите предупреждение «Использовать неинициализированное значение ...», если у вас включены предупреждения (что вам следует). Тем не менее, оператор с автоинкрементом ( ++ ) является частным случаем. Для удобства он тихо преобразует значение из undef в 0 перед его увеличением.

Если вы используете их как число, Perl преобразует их в 0. Если вы используете их как строку, Perl преобразует их в '' (пустая строка). В большинстве случаев вы получите предупреждение «Использовать неинициализированное значение ...», если у вас включены предупреждения (что вам следует). Тем не менее, оператор с автоинкрементом ( ++ ) является частным случаем. Для удобства он тихо преобразует значение из undef в 0 перед его увеличением.

2
ответ дан 5 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

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