Size: a a a

2021 February 13

VG

Vadim Goncharov in Modern::Perl
Василий Степанович Родин
Да не они одни такие. Аська в мыло ру попала. Так те юзеров с неофициальными клиентами не просто разогнали. Они их уины вообще уничтожили. Негодяи. Рамблер хоть только пугает юзеров своих. Типа на понт только берёт их. А мыло ру юзеров вообще завалила. И без этого-то аська была уже не в моде под натиском аацапо телеграмо виберов и т.п. Но олды ещё юзали её как дань уважения своей молодости конца 90-х. А тут такое... 😲
да ну прям, у меня старая Миранда работала вплоть до отключения старого протокола 2 года назад
источник

ВР

Василий Степанович Р... in Modern::Perl
Oleg Pronin
Нет. Результат $hash{nonexistent} это undef а не def даже в показанном вами примере. Тут работу делает функция push.

Это lvalue context. Ничего общего с autovivification который указывал вадим здесь нет. Последний работает в rvalue context.
В общих чертах: элементы массивов и хешей в lvalue контексте автосоздаются со значением undef. А затем естессно присвается чтото в них.

Пример с push более сложен чем кажется многим.

Во первых push на самом деле принимает arrayref, это лишь синтаксическая видимость что там просто array. Когда вы передаете туда @$arr, Никакого разыменования arrayref там нет, иначе бы сразу отьехали с эксепшеном когда там undef.
Push если ему передали lvalue undef апгрейдит его до arrayref. Если rvalue undef то вылетит.
А так как push провоцирует lvalue context, то элемент хеша автосоздается со значением undef, и этот lvalue undef уходит в пуш и апгрейдится.

Примеры
push @{undef()}, 1;
Вылет, изменение rvalue undef запрещено.

my $a = undef;
push @$a, 1;
Все ок, апгрейд lvalue undef до arrayref

my %h;

say $h{key1};
Rvalue context, элемент не создается.

$h{key1}++;
Lvalue context, элемент создается при поиске как undef, затем выполняется операция.

say $h{h}{key};
Оба поиска в rvalue context. Первый уровень создается механизмом autovivification.

$h{h}{key}++;
Первый поиск rvalue и создает autovivification, второй поиск lvalue, и создает undef через hash lvalue fetch

say @{$h{arr}};
Вылет. Разыменование всегда отьезжает на undefe

push @{$h{arr}}, 1;
Ок, lvalue context, результат lvalue undef, и далее в пуше он апгрейдится.
Да. Я поспешил скпазать о том, что хешевый элемент от ундеф есть деф. Пардон.
источник

AP

Anton Petrusevich in Modern::Perl
Василий Степанович Родин
@{$hash{undef}} - это не @{undef}, а это очень даже @{def}, т.к. $hash{undef} = уже имхо не undef, а def, хоть ключ этого элемента и не определён.
добавление к тому, что сказал Олег. ключи хеша всегда строки и они не могут быть андефейнед:
$ perl -MData::Dumper -E '$h{undef}=undef; $h{$a} = "a"; say Dumper \%h'
$VAR1 = {
         'undef' => undef,
         '' => 'a'
       };
источник

И

Иван in Modern::Perl
А можно както записать такое условие if ($n == 1 и 2){
источник

И

Иван in Modern::Perl
не знаю как реализовать это "И"
источник

И

Иван in Modern::Perl
я пробовал ||, &&, and, or и просто запятую
источник

И

Иван in Modern::Perl
некоторые работают но при этом функция запускается даже если я введу 3 к примеру
источник

IB

Ivan Bessarabov in Modern::Perl
что?
источник

IB

Ivan Bessarabov in Modern::Perl
ты хочешь сделать условие — которое сработает если $n равно 1 и одновременно с этим $n равно 2 ?
источник

И

Иван in Modern::Perl
равно только 1 или 2
источник

IB

Ivan Bessarabov in Modern::Perl
Иван
равно только 1 или 2
источник

И

Иван in Modern::Perl
ааааааа так вот оно как
источник

И

Иван in Modern::Perl
благодарю
источник

И

Иван in Modern::Perl
ато я записывал вот так if($n == 1||2){
источник

IB

Ivan Bessarabov in Modern::Perl
да — это всегда выполнится
источник

IB

Ivan Bessarabov in Modern::Perl
вторая часть (2) — всегда истина, ты говоришь "$n = 1 или истина" — результат это всегда истина
источник

И

Иван in Modern::Perl
ясно
источник

B

BSV in Modern::Perl
if ( grep {$n == $_} qw(1 2) ) {}
Ещё так можно
источник

И

Иван in Modern::Perl
интересно
источник

IB

Ivan Bessarabov in Modern::Perl
BSV
if ( grep {$n == $_} qw(1 2) ) {}
Ещё так можно
Для двух значений я бы так не делал. Но если значений больше — то это отличный вариант.
источник