Генерация синтаксиса регулярных выражений Perl

Это продолжение вопроса, размещенного здесь: синтаксис Perl Regex

В результате этого обсуждения был получен следующий сценарий:

#!/usr/bin/env perl
use strict;
use warnings;

my @lines = <DATA>;

my $current_label = '';
my @ordered_labels;
my %data;
for my $line (@lines) {
    if ( $line =~ /^\/(.*)$/ ) { # starts with slash
        $current_label = $1;
        push @ordered_labels, $current_label;
        next;
    }
    if ( length $current_label ) {
        if ( $line =~ /^(\d) "(.*)"$/ ) {
            $data{$current_label}{$1} = $2;
            next;
        }
    }
}

for my $label ( @ordered_labels ) {
    print "$label <- as.factor($label\n";
    print "    , levels= c(";
    print join(',',map { $_ } sort keys %{$data{$label}} );
    print ")\n";
    print "    , labels= c(";
    print join(',',
        map { '"' . $data{$label}{$_} . '"'  }
        sort keys %{$data{$label}} );
    print ")\n";
    print "    )\n";
}

__DATA__
...A bunch of nonsense I do not care about...
...
 Value Labels
/gender
1 "M"
2 "F"
/purpose
 1 "business"
 2 "vacation"
 3 "tiddlywinks"

execute . 

По сути, мне нужно собрать Perl, чтобы приспособить сокращенный синтаксис, найденный в файле SPSS. Для соседних столбцов SPSS позволяет ввести что-то вроде:

VALUE LABELS
/agree1 to agree5
1 "Strongly disagree"
2 "Disagree"
3 "Neutral"
4 "Agree"
5 "Strongly agree"

Поскольку скрипт в настоящее время существует, он сгенерирует это:

agree1 to agree5 <- factor(agree1 to agree5
    , levels= c(1,2,3,4,5,6)
    , labels= c("Strongly disagree","Disagree","Neutral","Agree","Strongly agree","N/A")
    )

и мне нужно, чтобы он произвел что-то вроде этого:

agree1 <- factor(agree1 
    , levels= c(1,2,3,4,5,6)
    , labels= c("Strongly disagree","Disagree","Neutral","Agree","Strongly agree","N/A")
    )
agree2 <- factor(agree2 
    , levels= c(1,2,3,4,5,6)
    , labels= c("Strongly disagree","Disagree","Neutral","Agree","Strongly agree","N/A")
    )
…

person Chase    schedule 09.08.2010    source источник
comment
Итак, вам нужна помощь в преобразовании существующего скрипта для создания другого вывода? Разница кажется незначительной: конечно, вы должны иметь возможность редактировать только строки agree1? Можете ли вы уточнить, с какой частью у вас возникли трудности?   -  person Ether    schedule 09.08.2010
comment
По сути, мне нужно сделать еще один цикл for, когда синтаксис SPSS содержит сокращение \var1 to varN. В настоящее время сценарий обрабатывает var1 to varN как одну переменную, когда ему нужно создать новые переменные для var1, var2, var3, varN.   -  person Chase    schedule 09.08.2010
comment
Чейз: вы получите гораздо лучшую помощь, если не только объясните, чего хотите, но и объясните, где у вас возникли проблемы с выполнением этого самостоятельно.   -  person ysth    schedule 10.08.2010


Ответы (1)


person    schedule
comment
@FM - спасибо за ваш ответ. Мое незнание Perl явно ограничивает меня здесь, и я вижу, что здесь есть вся необходимая информация для достижения того, что мне нужно. Мне нужно потратить некоторое время на переваривание того, как вы подошли к этой проблеме. Мне нравится, как вы разбили каждую из основных задач на отдельные подпрограммы. - person Chase; 11.08.2010