Мне очень нужна ваша помощь для понимания следующего примера кода на Perl:
#!/usr/bin/perl
# Hashtest
use strict;
use DBI;
use DBIx::Log4perl;
use Data::Dumper;
use utf8;
if (my $dbh = DBIx::Log4perl->connect("DBI:mysql:myDB","myUser","myPassword",{
RaiseError => 1,
PrintError => 1,
AutoCommit => 0,
mysql_enable_utf8 => 1
}))
{
my $data = undef;
my $sql_query = <<EndOfSQL;
SELECT 1
EndOfSQL
my $out = $dbh->prepare($sql_query);
$out->execute() or exit(0);
my $row = $out->fetchrow_hashref();
$out->finish();
# Debugging
print Dumper($row);
$dbh->disconnect;
exit(0);
}
1;
Если я запускаю этот код на двух машинах, я получаю разные результаты.
Результат на машине 1:(Результат мне нужен с целочисленным значением)
arties@p51s:~$ perl hashTest.pl
Log4perl: Seems like no initialization happened. Forgot to call init()?
$VAR1 = {
'1' => 1
};
Результат на машине 2: (Результат, который создает проблемы из-за строкового значения)
arties@core3:~$ perl hashTest.pl
Log4perl: Seems like no initialization happened. Forgot to call init()?
$VAR1 = {
'1' => '1'
};
Как вы видите на машине 1 значениеиз MySQL будет интерпретироваться как целочисленное значение, а на компьютере 2 - как строковое значение. Мне нужно на обеих машинах целочисленное значение. И невозможно изменить хэш позже, потому что исходный код имеет слишком много значений, которые должны быть изменены ...
Обе машины используют DBI 1.642 и DBIx :: Log4perl 0.26
Единственное отличие заключается в том, что версия 1 для компьютера Perl (v5.26.1) отличается от машины 2 (v5.14.2)
Поэтому большой вопрос заключается в том, как я могу убедиться, что всегда получаю целое число в хэше какрезультат?
Обновление 10.10.2019:
Чтобы показать, возможно, лучшую проблему, я улучшаю приведенный выше пример:
...
use Data::Dumper;
use JSON; # <-- Inserted
use utf8;
...
...
print Dumper($row);
# JSON Output
print JSON::to_json($row)."\n"; # <-- Inserted
$dbh->disconnect;
...
Теперь выводна машине 1 с последней строкой вывод JSON:
arties@p51s:~$ perl hashTest.pl
Log4perl: Seems like no initialization happened. Forgot to call init()?
$VAR1 = {
'1' => 1
};
{"1":1}
Теперь вывод на машине 2 с последней строкой вывод JSON:
arties@core3:~$ perl hashTest.pl
$VAR1 = {
'1' => '1'
};
{"1":"1"}
Вы видите, что оба Data :: DumperИ JSON имеет такое же поведение. И, как я написал в bevor, +0 не вариант, потому что оригинальный хеш намного сложнее.
Обе машины используют JSON 4.02