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

Data::Dumper

115 views
Skip to first unread message

Sergey Gernichenko

unread,
Jan 29, 2011, 4:38:42 AM1/29/11
to
Доброго времени суток тебе, *All*!

Как сохранить результат работы Data::Dumper в файл так, чтобы нормально был
виден русский текст, а не в виде юникодных кодов?

Делаю так:

use Encode;
use encoding "cp1251", STDOUT=>"cp866";
$d->{russian}='Рашн текст';
#open F,">:utf8","sells";
open F,">:encoding(cp1251)","sells";
print F Data::Dumper->Dump([$d],['d']);
close F

в итоге в файле получаю:
'russian' => "\x{420}\x{430}\x{448}\x{43d}
'russian' => \x{442}\x{435}\x{43a}\x{441}\x{442}",


А как получить исходный "Рашн текст" ?


До скорых встреч, *All* С уважением, *Sergey*.

Eric Pozharski

unread,
Jan 29, 2011, 6:45:47 AM1/29/11
to
with <MSGID_2=3A5079=2F46.90_...@fidonet.org> Sergey Gernichenko wrote:

SG> ��� ��������� ��������� ������ Data::Dumper � ���� ���, �����
SG> ��������� ��� ����� ������� �����, � �� � ���� ��������� �����?

SG> ����� ���:

SG> use Encode;
SG> use encoding "cp1251", STDOUT=>"cp866";

(note ��� �����������������, ���� ����� ����, �����) �������� ���������
�� �������. ���� �� �������� ���� ������ ������.

SG> $d->{russian}='���� �����';
SG> #open F,">:utf8","sells";
SG> open F,">:encoding(cp1251)","sells";
SG> print F Data::Dumper->Dump([$d],['d']);
SG> close F

SG> � ����� � ����� �������:
SG> 'russian' => "\x{420}\x{430}\x{448}\x{43d}
SG> 'russian' => \x{442}\x{435}\x{43a}\x{441}\x{442}",

(Subj ������ ��� ����: "���� ���������") � �����, � ��������� ������
���������� ������. �������� ����� Dump � ������, �������� �� ������ �
s{}{}ge, ����� �������� ��� ������ (� 'open F, ">:encoding"') ������
��������. ������, �������� ���� �� *internal encoding*. ��� ��� � �
���������. ��� ���������� ����� ��� ������ �� ��������.

SG> � ��� �������� �������� "���� �����" ?

print "russian => $d->{russian}";

��� �������, �� ������� �� � ��� �����������.

--
Torvalds' goal for Linux is very simple: World Domination
Stallman's goal for GNU is even simpler: Freedom

Sergey Gernichenko

unread,
Jan 31, 2011, 3:20:18 PM1/31/11
to
Доброго времени суток тебе, *Eric*!

В субботу, 29 января 2011 года, в 14:45, ты писал(а) мне:


SG>> Как сохранить результат работы Data::Dumper в файл так, чтобы
SG>> нормально был виден русский текст, а не в виде юникодных кодов?

SG>> Делаю так:

SG>> use Encode;
SG>> use encoding "cp1251", STDOUT=>"cp866";

EP> (note для экспериментаторов, если такие есть, ессно) Заменить
EP> кодировку на местную. Пока не поправил было вообще весело.
В смысле? исходник в виндовой кодировке, вывод в консоль - в досовской. Просто
print "Русский тескст" норамльно отрабатывает.


SG>> $d->{russian}='Рашн текст';


SG>> #open F,">:utf8","sells";
SG>> open F,">:encoding(cp1251)","sells";
SG>> print F Data::Dumper->Dump([$d],['d']);
SG>> close F

SG>> в итоге в файле получаю:


SG>> 'russian' => "\x{420}\x{430}\x{448}\x{43d}

SG>> \x{442}\x{435}\x{43a}\x{441}\x{442}",

EP> (Subj должен был быть: "хочу странного") В общем, я обломался делать
EP> работающий пример. Печатаем вывод Dump в строку, проходим по строке с
EP> s{}{}ge, потом печатаем эту строку (с 'open F, ">:encoding"') должно
EP> взлететь.

EP> Однако, заменять надо на *internal encoding*.
Это как? ведь в строки-то так и хранятся во внутренней кодировке.

EP> Вот тут я и
EP> обломался. Или получается мусор или ничего не меняется.
С присваиванием в переменную вывод сабжа у меня тоже ничего не вышло...


SG>> А как получить исходный "Рашн текст" ?
EP> print "russian => $d->{russian}";
EP> Мне кажется, ты копаешь не в том направлении.
Предлагаешь переписать функционал Data::Dumper? не, неохота... :)


До скорых встреч, *Eric* С уважением, *Sergey*.

Eric Pozharski

unread,
Feb 3, 2011, 1:20:44 AM2/3/11
to
with <MSGID_2=3A5079=2F46.90_...@fidonet.org> Sergey Gernichenko wrote:
*SKIP*

SG>>> use Encode;
SG>>> use encoding "cp1251", STDOUT=>"cp866";

EP>> (note ��� �����������������, ���� ����� ����, �����) ��������
EP>> ��������� �� �������. ���� �� �������� ���� ������ ������.
SG> � ������? �������� � �������� ���������, ����� � ������� - �
SG> ���������. ������ print "������� ������" ��������� ������������.

��� slrn ���������� � utf8. �� � ��� ��������� ��� �������� �����.

*SKIP*

EP>> ������, �������� ���� �� *internal encoding*.
SG> ��� ���? ���� � ������-�� ��� � �������� �� ���������� ���������.

����� ������ ���� ���������� ���������.

EP>> ��� ��� � �
EP>> ���������. ��� ���������� ����� ��� ������ �� ��������.
SG> � ������������� � ���������� ����� ����� � ���� ���� ������ ��
SG> �����...

my $dump;
open my $fh, q|>|, \$dump or die $!;
print $fh Data::Dumper->Dump([$d],['d']);

SG>>> � ��� �������� �������� "���� �����" ?


EP>> print "russian => $d->{russian}";

EP>> ��� �������, �� ������� �� � ��� �����������.
SG> ����������� ���������� ���������� Data::Dumper? ��, �������... :)

��������� �������� perldoc YAML::Syck (���, perldoc YAML::Tiny (�����
��������������, ���� pure perl)).

Dmitry E. Oboukhov

unread,
Feb 4, 2011, 3:52:42 AM2/4/11
to
SG>> в итоге в файле получаю:
SG>> 'russian' => "\x{420}\x{430}\x{448}\x{43d}
SG>> 'russian' => \x{442}\x{435}\x{43a}\x{441}\x{442}",

EP> (Subj должен был быть: "хочу странного") В общем, я обломался делать
EP> работающий пример.

ничего странного. при отладке вебприложений очень часто хочется
сделать die Dumper и поглядеть что там внутри объектов. соответственно
русские символы хочется видеть правильными.

мы тоже извратнулись на эту тему написав свой регулярник после вызова
дампера.

EP> Печатаем вывод Dump в строку, проходим по строке с


EP> s{}{}ge, потом печатаем эту строку (с 'open F, ">:encoding"') должно

EP> взлететь. Однако, заменять надо на *internal encoding*. Вот тут я и


EP> обломался. Или получается мусор или ничего не меняется.

но с кодировками мы не парились, везде utf8 и все тут.
зачем сейчас лезть в поддержку не utf8? оно все равно помрет


... Природа мудра! у гомиков, либералов и прочих извращенцев обычно нет детей.

Eric Pozharski

unread,
Feb 5, 2011, 5:26:41 AM2/5/11
to
with <MSGID_2=3A5020=2F830.100...@fidonet.org> Dmitry E Oboukhov wrote:
*SKIP*
EP>> Печатаем вывод Dump в строку, проходим по строке с s{}{}ge,
EP>> потом печатаем эту строку (с 'open F, ">:encoding"') должно

EP>> взлететь. Однако, заменять надо на *internal encoding*. Вот тут
EP>> я и обломался. Или получается мусор или ничего не меняется.

DEO> но с кодировками мы не парились, везде utf8 и все тут. зачем
DEO> сейчас лезть в поддержку не utf8? оно все равно помрет

Вообще-то напоминает чтение текста в cp866 с экрана в cp437. Неа? Со
временем научимся читать эти кракозябры напрямую.

Sergey Gernichenko

unread,
Feb 5, 2011, 2:05:32 PM2/5/11
to
Доброго времени суток тебе, *Dmitry*!

В пятницу, 04 февраля 2011 года, в 11:52, ты писал(а) Eric Pozharski:

DEO> мы тоже извратнулись на эту тему написав свой регулярник после вызова
DEO> дампера.
Дай, пожалуйста, работающий пример такой регулярки. У меня не получилось
сделать.


До скорых встреч, *Dmitry* С уважением, *Sergey*.

Dmitry E. Oboukhov

unread,
Feb 6, 2011, 10:15:01 AM2/6/11
to
EP>>> Печатаем вывод Dump в строку, проходим по строке с s{}{}ge,
EP>>> потом печатаем эту строку (с 'open F, ">:encoding"') должно
EP>>> взлететь. Однако, заменять надо на *internal encoding*. Вот тут
EP>>> я и обломался. Или получается мусор или ничего не меняется.

DEO>> но с кодировками мы не парились, везде utf8 и все тут. зачем
DEO>> сейчас лезть в поддержку не utf8? оно все равно помрет

EP> Вообще-то напоминает чтение текста в cp866 с экрана в cp437. Hеа? Со
EP> временем научимся читать эти кракозябры напрямую.

суть в том что внутренности самого скрипта надо в любом случае делать
в utf8,
а вот со внешним миром можно общаться с установкой encoding'ов в
значение соответствующее локали. тогда можно думать только об utf8, а
о том как подать это пользователю можно уже не париться

... Слабый пол сильнее сильного в силу слабости сильного пола к слабому.

Dmitry E. Oboukhov

unread,
Feb 6, 2011, 10:31:58 AM2/6/11
to
On 22:05 Sat 05 Feb , Sergey Gernichenko wrote:
SG> ������� ������� ����� ����, *Dmitry*!

SG> � �������, 04 ������� 2011 ����, � 11:52, �� �����(�) Eric Pozharski:

DEO>> �� ���� ������������ �� ��� ���� ������� ���� ���������� ����� ������
DEO>> �������.
SG> ���, ����������, ���������� ������ ����� ���������. � ���� �� ����������
SG> �������.

$dump =~ s/(\\x\{[\da-fA-F]+\})/eval "qq{$1}"/eg;

����� ������� � ������� /ee ����������, �� ��� ���������� �����-�� ��
������ ���� � ��� ���������� ����� �������� ���������, � ���
������������ �� ������������, � ������ �� ����������� ����� ������ :)


��������� ������ ����� �����:

��� ����:


sub StringDumper
{
my $dump = Dumper(@_);
$dump =~ s/(\\x\{[\da-fA-F]+\})/eval "qq{$1}"/eg;
$dump;
}

my $test = {
���� => '��������',
};

print StringDumper $test;
print Dumper $test;

����������:

{
"����" => "��������"
}
{
"\x{442}\x{435}\x{441}\x{442}" =>
"\x{437}\x{43d}\x{430}\x{447}\x{435}\x{43d}\x{438}\x{435}"
}


... �������, ������, ������ ������!

Eric Pozharski

unread,
Feb 7, 2011, 7:28:54 AM2/7/11
to
with <MSGID_2=3A5020=2F830.100...@fidonet.org> Dmitry E Oboukhov wrote:
*SKIP*

DEO> суть в том что внутренности самого скрипта надо в любом случае
DEO> делать в utf8, а вот со внешним миром можно общаться с установкой
DEO> encoding'ов в значение соответствующее локали. тогда можно думать
DEO> только об utf8, а о том как подать это пользователю можно уже не
DEO> париться

Вот это как раз то, чего мне в понималке то и не хватало. Now, I feel
much better.

0 new messages