Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Что за фигня?

0 views
Skip to first unread message

Gennadij Pastuhov

unread,
Apr 24, 2020, 12:15:01 PM4/24/20
to
Рад всех приветствовать! А особенно - All!

Дано: хэш:

my $PRODUCTS = {
ssl_dv_geotrust => 'GeoTrust Standard DV SSL Certificate',
ssl_dv_rapidssl => 'RapidSSL Standard DV SSL Certificate',
ssl_dv_thawte => 'Thawte SSL123 DV',
};

Кусок кода:

for my $key (keys $result) {
print "\nkey:" . Dumper $key;
my ($product_name_id, $validity_years) = split '__', $key;
print "\nproduct_name_id:'$product_name_id'\tvalidity_years:'$validity_years'";
if (defined $PRODUCTS->{$product_name_id}) {
...
} else {
print "\nproduct_name_id:$product_name_id -- not found";
print "\nPRODUCTS:" . Dumper $PRODUCTS->{$product_name_id};


В $result хранится результат разjsonивания запроса. И этот код порождает такой
лог:

key:$VAR1 = 'ssl_dv_thawte__2';

product_name_id:'ssl_dv_thawte' validity_years:'2'
product_name_id:ssl_dv_thawte -- not found
PRODUCTS:$VAR1 = undef;

Даже не представляю, куда копать. Если взять вот эти тексты и выполнить в
скрипте, то всё работает. Т.е., как будто эти латинские буквы в работе какие-то
не те. Или меня глючит?

... Jonny wanna live

Eugene Grosbein

unread,
Apr 24, 2020, 7:05:01 PM4/24/20
to
24 апр. 2020, пятница, в 18:56 NOVT, Gennadij Pastuhov написал(а):

GP> Дано: хэш:
GP> my $PRODUCTS = {
GP> ssl_dv_geotrust => 'GeoTrust Standard DV SSL Certificate',
GP> ssl_dv_rapidssl => 'RapidSSL Standard DV SSL Certificate',
GP> ssl_dv_thawte => 'Thawte SSL123 DV',
GP> };

GP> Кусок кода:
GP> for my $key (keys $result) {
GP> print "\nkey:" . Dumper $key;
GP> my ($product_name_id, $validity_years) = split '__', $key;
GP> print
GP> "\nproduct_name_id:'$product_name_id'\tvalidity_years:'$validity_years'";
GP> if (defined $PRODUCTS->{$product_name_id}) {
GP> ...
GP> } else {
GP> print "\nproduct_name_id:$product_name_id -- not found";
GP> print "\nPRODUCTS:" . Dumper $PRODUCTS->{$product_name_id};
GP> В $result хранится результат разjsonивания запроса. И этот код порождает
GP> такой
GP> лог:
GP> key:$VAR1 = 'ssl_dv_thawte__2';
GP> product_name_id:'ssl_dv_thawte' validity_years:'2'
GP> product_name_id:ssl_dv_thawte -- not found
GP> PRODUCTS:$VAR1 = undef;
GP> Даже не представляю, куда копать. Если взять вот эти тексты и выполнить в
GP> скрипте, то всё работает. Т.е., как будто эти латинские буквы в работе
GP> какие-то
GP> не те. Или меня глючит?

Вообще удивляюсь, что у тебя хоть что-то печатает,
потому что вызов keys $result некорректен и ты,
очевидно, не используешь use strict и use warnings,
которые обязательно нужно всегда использовать.

keys берёт аргументом хеш или список, а у тебя скаляр.
Добавляй use strict и use warnings, исправляй все ошибки
в коде, на которые они укажут и пробуй снова.

Eugene
--
Прекрасны тонко отшлифованная драгоценность; победитель, раненный в бою;
слон во время течки; река, высыхающая зимой; луна на исходе; юная женщина,
изнуренная наслаждением, и даятель, отдавший все нищим. (Дхарма)

Gennadij Pastuhov

unread,
Apr 25, 2020, 12:15:01 AM4/25/20
to
Рад всех приветствовать! А особенно - Eugene!

Суббота апреля 25 20 05:47 Eugene Grosbein писал к Gennadij Pastuhov:

GP>> Дано: хэш:
GP>> my $PRODUCTS = {
GP>> ssl_dv_geotrust => 'GeoTrust Standard DV SSL Certificate',
GP>> ssl_dv_rapidssl => 'RapidSSL Standard DV SSL Certificate',
GP>> ssl_dv_thawte => 'Thawte SSL123 DV',
GP>> };

GP>> Кусок кода:
GP>> for my $key (keys $result) {
GP>> print "\nkey:" . Dumper $key;
GP>> my ($product_name_id, $validity_years) = split
GP>> '__', $key;
GP>> print
GP>> "\nproduct_name_id:'$product_name_id'\tvalidity_years:'$validity_
EG> years'";
GP>> if (defined $PRODUCTS->{$product_name_id}) {
GP>> ...
GP>> } else {
GP>> print "\nproduct_name_id:$product_name_id -- not found";
GP>> print "\nPRODUCTS:" . Dumper $PRODUCTS->{$product_name_id};
GP>> В $result хранится результат разjsonивания запроса. И этот код
GP>> порождает такой
GP>> лог:
GP>> key:$VAR1 = 'ssl_dv_thawte__2';
GP>> product_name_id:'ssl_dv_thawte' validity_years:'2'
GP>> product_name_id:ssl_dv_thawte -- not found
GP>> PRODUCTS:$VAR1 = undef;
GP>> Даже не представляю, куда копать. Если взять вот эти тексты и
GP>> выполнить в
GP>> скрипте, то всё работает. Т.е., как будто эти латинские буквы в
GP>> работе какие-то
GP>> не те. Или меня глючит?

EG> Вообще удивляюсь, что у тебя хоть что-то печатает,
EG> потому что вызов keys $result некорректен и ты,
EG> очевидно, не используешь use strict и use warnings,
EG> которые обязательно нужно всегда использовать.

EG> keys берёт аргументом хеш или список, а у тебя скаляр.
EG> Добавляй use strict и use warnings, исправляй все ошибки
EG> в коде, на которые они укажут и пробуй снова.

Начало того скрипта:

use strict;
use warnings;
use utf8;

... Jonny wanna live

Eugene Grosbein

unread,
Apr 25, 2020, 10:45:01 AM4/25/20
to
25 апр. 2020, суббота, в 07:08 NOVT, Gennadij Pastuhov написал(а):
GP> Hачало того скрипта:
GP> use strict;
GP> use warnings;
GP> use utf8;

А тогда всё зависит от версии perl. Типа намёк.

Eugene

Gennadij Pastuhov

unread,
Apr 25, 2020, 11:40:01 AM4/25/20
to
Рад всех приветствовать! А особенно - Eugene!

Суббота апреля 25 20 21:31 Eugene Grosbein писал к Gennadij Pastuhov:

GP>>>> Дано: хэш:
GP>>>> my $PRODUCTS = {
GP>>>> ssl_dv_geotrust => 'GeoTrust Standard DV SSL Certificate',
GP>>>> ssl_dv_rapidssl => 'RapidSSL Standard DV SSL Certificate',
GP>>>> ssl_dv_thawte => 'Thawte SSL123 DV',
GP>>>> };
GP>>>> Кусок кода:
GP>>>> for my $key (keys $result) {
GP>>>> print "\nkey:" . Dumper $key;
GP>>>> my ($product_name_id, $validity_years) = split
GP>>>> '__', $key;
GP>>>> print
GP>>>> "\nproduct_name_id:'$product_name_id'\tvalidity_years:'$validit
GP>>>> y_
EG> А тогда всё зависит от версии perl. Типа намёк.

$ perl -v

This is perl 5, version 14, subversion 2 (v5.14.2) built for
x86_64-linux-gnu-thread-multi
(with 89 registered patches, see perl -V for more detail)

... Jonny wanna live

Eugene Grosbein

unread,
Apr 25, 2020, 12:55:01 PM4/25/20
to
25 апр. 2020, суббота, в 18:24 NOVT, Gennadij Pastuhov написал(а):

GP>>>>> Дано: хэш:
GP>>>>> my $PRODUCTS = {
GP>>>>> ssl_dv_geotrust => 'GeoTrust Standard DV SSL Certificate',
GP>>>>> ssl_dv_rapidssl => 'RapidSSL Standard DV SSL Certificate',
GP>>>>> ssl_dv_thawte => 'Thawte SSL123 DV',
GP>>>>> };
GP>>>>> Кусок кода:
GP>>>>> for my $key (keys $result) {
GP>>>>> print "\nkey:" . Dumper $key;
GP>>>>> my ($product_name_id, $validity_years) = split
GP>>>>> '__', $key;
GP>>>>> print
GP>>>>> "\nproduct_name_id:'$product_name_id'\tvalidity_years:'$validit
GP>>>>> y_
EG>>>> years'";
GP>>>>> if (defined $PRODUCTS->{$product_name_id}) {
GP>>>>> ...
GP>>>>> } else {
GP>>>>> print "\nproduct_name_id:$product_name_id -- not found";
GP>>>>> print "\nPRODUCTS:" . Dumper $PRODUCTS->{$product_name_id};
GP>>>>> В $result хранится результат разjsonивания запроса. И этот код
GP>>>>> порождает такой лог:

EG>> А тогда всё зависит от версии perl. Типа намёк.
GP> $ perl -v
GP> This is perl 5, version 14, subversion 2 (v5.14.2) built for
GP> x86_64-linux-gnu-thread-multi
GP> (with 89 registered patches, see perl -V for more detail)

Это довольно старая версия perl и какие в ней были баги/особенности,
сейчас тебе тут вряд ли кто ответит. Проще всего заменить
весь твой диагностический вывод на один print Dumper($result)
и поглядеть на него. Вывод в студию.

Eugene
--
Choose no life

Gennadij Pastuhov

unread,
Apr 25, 2020, 4:15:01 PM4/25/20
to
Рад всех приветствовать! А особенно - Eugene!

Суббота апреля 25 20 23:40 Eugene Grosbein писал к Gennadij Pastuhov:

GP>>>>>> Дано: хэш:
GP>>>>>> my $PRODUCTS = {
GP>>>>>> ssl_dv_geotrust => 'GeoTrust Standard DV SSL
GP>>>>>> Certificate',
GP>>>>>> ssl_dv_rapidssl => 'RapidSSL Standard DV SSL
GP>>>>>> Certificate',
GP>>>>>> ssl_dv_thawte => 'Thawte SSL123 DV',
GP>>>>>> };
GP>>>>>> Кусок кода:
GP>>>>>> for my $key (keys $result) {
GP>>>>>> print "\nkey:" . Dumper $key;
GP>>>>>> my ($product_name_id, $validity_years) =
GP>>>>>> split
GP>>>>>> '__', $key;
GP>>>>>> print
GP>>>>>> "\nproduct_name_id:'$product_name_id'\tvalidity_years:'$valid
GP>>>>>> it
GP>>>>>> y_
EG>>>>> years'";
GP>>>>>> if (defined $PRODUCTS->{$product_name_id}) {
GP>>>>>> ...
GP>>>>>> } else {
GP>>>>>> print "\nproduct_name_id:$product_name_id -- not found";
GP>>>>>> print "\nPRODUCTS:" . Dumper $PRODUCTS->{$product_name_id};
GP>>>>>> В $result хранится результат разjsonивания запроса. И этот
GP>>>>>> код
GP>>>>>> порождает такой лог:

EG>>> А тогда всё зависит от версии perl. Типа намёк.
GP>> $ perl -v
GP>> This is perl 5, version 14, subversion 2 (v5.14.2) built for
GP>> x86_64-linux-gnu-thread-multi
GP>> (with 89 registered patches, see perl -V for more detail)

EG> Это довольно старая версия perl и какие в ней были баги/особенности,
EG> сейчас тебе тут вряд ли кто ответит. Проще всего заменить
EG> весь твой диагностический вывод на один print Dumper($result)
EG> и поглядеть на него. Вывод в студию.

Без проблем. Но не весь, а только нужные строки, остальные аналогичные:

result:$VAR1 = {
'ssl_dv_thawte__2' => 10,
};

... Jonny wanna live

Eugene Grosbein

unread,
Apr 26, 2020, 4:50:02 AM4/26/20
to
25 апр. 2020, суббота, в 23:07 NOVT, Gennadij Pastuhov написал(а):

GP>>>>>>> Кусок кода:
GP>>>>>>> for my $key (keys $result) {

EG>> Это довольно старая версия perl и какие в ней были баги/особенности,
EG>> сейчас тебе тут вряд ли кто ответит. Проще всего заменить
EG>> весь твой диагностический вывод на один print Dumper($result)
EG>> и поглядеть на него. Вывод в студию.

GP> Без проблем. Hо не весь, а только нужные строки, остальные аналогичные:
GP> result:$VAR1 = {
GP> 'ssl_dv_thawte__2' => 10,
GP> };

Фигурные скопбки означают, что $result это ссылка на хеш,
так что всё-таки лучше бы ты писал как положено
keys %{$result} вместо твоего keys $result.
Я удивлён, что старый perl при strict/warnings это пропустил.

Eugene
--
Кара за одно съеденное яблоко, все-таки, была несоизмеримо велика,
приступ диареи послужил бы достаточным уроком.

Gennadij Pastuhov

unread,
Apr 26, 2020, 5:55:01 AM4/26/20
to
Рад всех приветствовать! А особенно - Eugene!

Воскресенье апреля 26 20 15:44 Eugene Grosbein писал к Gennadij Pastuhov:

GP>>>>>>>> Кусок кода:
GP>>>>>>>> for my $key (keys $result) {
EG>>> Это довольно старая версия perl и какие в ней были
EG>>> баги/особенности,
EG>>> сейчас тебе тут вряд ли кто ответит. Проще всего заменить
EG>>> весь твой диагностический вывод на один print Dumper($result)
EG>>> и поглядеть на него. Вывод в студию.
GP>> Без проблем. Hо не весь, а только нужные строки, остальные
GP>> аналогичные:
GP>> result:$VAR1 = {
GP>> 'ssl_dv_thawte__2' => 10,
GP>> };
EG> Фигурные скопбки означают, что $result это ссылка на хеш,
EG> так что всё-таки лучше бы ты писал как положено
EG> keys %{$result} вместо твоего keys $result.
EG> Я удивлён, что старый perl при strict/warnings это пропустил.

Это да, спасибо, пропустил. Результат не изменился.

... Jonny wanna live

Eugene Grosbein

unread,
Apr 26, 2020, 7:35:01 PM4/26/20
to
24 апр. 2020, пятница, в 18:56 NOVT, Gennadij Pastuhov написал(а):

GP> if (defined $PRODUCTS->{$product_name_id}) {

Думаю, что ошибка тут. Вместо defined тут необходимо использовать exists,
потому что иначе срабатывает autovivification:

https://perlmaven.com/autovivification

GP> product_name_id:ssl_dv_thawte -- not found
GP> PRODUCTS:$VAR1 = undef;

Eugene
--
Чтобы всё как у всех, но чтоб при этом - не так, как они.

Gennadij Pastuhov

unread,
Apr 27, 2020, 2:30:02 AM4/27/20
to
Рад всех приветствовать! А особенно - Eugene!

Понедельник апреля 27 20 06:16 Eugene Grosbein писал к Gennadij Pastuhov:

GP>> if (defined $PRODUCTS->{$product_name_id}) {

EG> Думаю, что ошибка тут. Вместо defined тут необходимо использовать
EG> exists, потому что иначе срабатывает autovivification:

EG> https://perlmaven.com/autovivification

GP>> product_name_id:ssl_dv_thawte -- not found
GP>> PRODUCTS:$VAR1 = undef;

Не-а:

product_name_id:'ssl_dv_thawte' validity_years:'2'
product_name_id:ssl_dv_thawte -- not foundPRODUCTS:$VAR1 = undef;

... Jonny wanna live

Gennadij Pastuhov

unread,
Apr 27, 2020, 6:00:01 AM4/27/20
to
Рад всех приветствовать! А особенно - Eugene!

Понедельник апреля 27 20 06:16 Eugene Grosbein писал к Gennadij Pastuhov:

GP>> if (defined $PRODUCTS->{$product_name_id}) {

EG> Думаю, что ошибка тут. Вместо defined тут необходимо использовать
EG> exists, потому что иначе срабатывает autovivification:

EG> https://perlmaven.com/autovivification

GP>> product_name_id:ssl_dv_thawte -- not found
GP>> PRODUCTS:$VAR1 = undef;

Спасибо, вопрос закрыт!

... Jonny wanna live

Eugene Grosbein

unread,
Apr 27, 2020, 3:35:02 PM4/27/20
to
27 апр. 2020, понедельник, в 12:55 NOVT, Gennadij Pastuhov написал(а):

EG>> Думаю, что ошибка тут. Вместо defined тут необходимо использовать
EG>> exists, потому что иначе срабатывает autovivification:
EG>> https://perlmaven.com/autovivification
GP>>> product_name_id:ssl_dv_thawte -- not found
GP>>> PRODUCTS:$VAR1 = undef;
GP> Спасибо, вопрос закрыт!

Что было-то?

Eugene
--
Сердце - малочувствительный, мускулистый, грубый и жесткий орган.

Gennadij Pastuhov

unread,
Apr 28, 2020, 3:30:02 AM4/28/20
to
Рад всех приветствовать! А особенно - Eugene!

Вторник апреля 28 20 02:24 Eugene Grosbein писал к Gennadij Pastuhov:

EG>>> Думаю, что ошибка тут. Вместо defined тут необходимо
EG>>> использовать
EG>>> exists, потому что иначе срабатывает autovivification:
EG>>> https://perlmaven.com/autovivification
GP>>>> product_name_id:ssl_dv_thawte -- not found
GP>>>> PRODUCTS:$VAR1 = undef;
GP>> Спасибо, вопрос закрыт!
EG> Что было-то?

В-общем, этот скрипт запускается не сам по себе, а как потомок объекта запуска
скриптов. И оказалось, что просто так там нельзя объявить глобальную
переменную.

... Jonny wanna live
0 new messages