[Moscow.pm] парсинг перла PPI conver array->hash

Nikolay Mishin mi на ya.ru
Чт Ноя 13 11:34:43 PST 2014


Привет MoscowPM!!

Рефакторю очередной проект и замучило меня
менять массив
my @list_regexes=($reg1_rx,$reg2_rx,$reg3_rx,$reg4_rx);
в такую структуру
my %list_regexes = ();
@list_regexes{ 'reg1_rx', 'reg2_rx', 'reg3_rx', 'reg4_rx' } =
  ( $reg1_rx, $reg2_rx, $reg3_rx, $reg4_rx );

написал скрипт, который это автоматически
https://github.com/mishin/presentation/blob/master/ppi_convert_array_to_hash.pl

use 5.14.0;
use PPI;
#use Smart::Comments;
my $file_name = shift or die "Usage: $0 file_4_transform\n";
my $doc = PPI::Document->new($file_name);
my $hash_name = '';
my @variables = ();
$doc->find(
sub {
my ( $root, $node ) = @_;
if ( $node->isa('PPI::Token::Symbol') && $node->symbol_type eq '$' ) {
push @variables, substr( $node, 1 );
}
if ( $node->isa('PPI::Token::Symbol') && $node->symbol_type eq '@' ) {
$hash_name = substr( $node, 1 );
}
}
);
my $left_side = join ',', map { "'$_'" } @variables;
my $right_side = join ',', map { "\$$_" } @variables;
my $full_text = <<"end_line";
my %${hash_name}=();
\@${hash_name}{
${left_side}
}
= (
${right_side}
);
end_line
use Perl::Tidy;
perltidy( source => \$full_text);

Так вот, сдается мне, что не кошерно так генерить perl код,
а что лучше это делать с помощью того же модуля PPI
может кто поможет 

переписать вот эту часть

my $full_text = <<"end_line";
my %${hash_name}=();
\@${hash_name}{
${left_side}
}
= (
${right_side}
);
end_line

только с помощью PPI?
-- 
С уважением
Николай Мишин



Подробная информация о списке рассылки Moscow-pm