Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Из строки в код


Автор: JamesMorgan 9.4.2012, 12:48
Добрый день, пишу вам в надежде найти решение, суть такая есть текстовый файл его содержимое:

Цитата

{ id => 1, path => 65, url => 31 }


Можно ли при чтение файла превратить эту строчку в анонимный хеш?
 
Если бы строки распологались на каждой строчке и без { } то тогда я бы обработал данные и сделал бы анонимный хеш, но нужно строго в таком варианте. smile 

Автор: reiserford 9.4.2012, 12:57
eval

Автор: Pfailed 9.4.2012, 13:16
А как бы вы сделали если бы они стояли на разных строках?

Автор: vadiml 9.4.2012, 13:33
JamesMorgan

JSON конверторы именно этим и занимаются.
Можете им строку скормить, предварительно чуть поправив, или посмотреть код в их модулях.

Автор: JamesMorgan 9.4.2012, 14:02
Цитата(Pfailed @ 9.4.2012,  13:16)
А как бы вы сделали если бы они стояли на разных строках?

Вот так бы сделал, но это на скорую руку:

Код

@data;

open (DATA, "<data.txt") or die "$!";

while ($line = <DATA>) {
    chomp($line);
    my ($key, $value) = split("=>", $line); 
    push(@data, { $key => $value });
}


Ок, буду смотреть в сторону JSON

Автор: Pfailed 9.4.2012, 14:19
Для вашего простейшего случая подойдет регулярное выражение: 
Код

my $str = '{ id => 1, path => 65, url => 31 }';
my %hash = $str =~ /(\w+)\s*=>\s*(\w+)/g;


Но если требуется уметь распозновать вложенные хеши и штуки типа {a => "x => {y => z}"}, то задача становится поинтересней. Тут я могу порекомендовать модуль Regexp::Grammars.

Автор: arto 9.4.2012, 14:27
# cat > /tmp/tst
{ id => 1, path => 65, url => 31 }
# perl -MData::Dumper -le 'print Dumper do $ARGV[0]' /tmp/tst
$VAR1 = {
          'url' => 31,
          'path' => 65,
          'id' => 1
        };

#

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)