Я разрабатывал сценарий, чтобы взять некоторый вывод из пакета IBM SPSS Statistics и преобразовать его в синтаксис ввода SPSS. В настоящее время у меня есть следующая проблема, которую я не могу понять. У меня есть текст, который выглядит следующим образом:
VALUE LABELS V10
-1
1 "Yes".
VALUE LABELS V11
-50.00
-33.33
-10 "Don't Know".
Я хочу заменить отрицательные значения, за которыми не следуют метки в кавычках и которые не имеют пробела, меткой с надписью «-9 «Отсутствует»», а затем я хочу зафиксировать каждое из этих отрицательных значений в хэш вместе с именем переменной (например, V10, V11), чтобы я мог распечатать их позже в операторе перекодирования. Я читаю этот файл через Perl, разделяя «строки» на буквальную точку, за которой следует новая строка (что означает конец команды в SPSS). Однако код, который я придумал до сих пор, заменяет и фиксирует только одно совпадение отрицательного значения на «строку», и я не уверен, что делаю неправильно. Мой текущий код выглядит так:
my %negmiss;
my @lines = split(/(\.\n)/,$_);
foreach my $line (@lines) {
my $modline = $line;
if ($line =~ /VALUE LABELS\s(\S+)/g) {
my $label_name = $1;
if ($line =~ /\n(-\d+(\.\d+)?)\n/g) {
$modline =~ /\n(-\d+(\.\d+)?)\n/\n -9 \"Missing\"\n/g;
push my @negname, $label_name;
push @{$negmiss{$label_name}}, $1;
}
}
print $modline;
}
foreach (@negname) {
print "RECODE $_ (@{ $negmiss{$_} } = -9\.\n";
}
Это частично работает, но опять же, это только подстановка и захват одного отрицательного значения для каждой из «строк», поэтому мой вывод выглядит следующим образом:
VALUE LABELS V10
-9 "Missing"
1 "Yes".
VALUE LABELS V11
-9 "Missing"
-33.33
-10 "Don't Know".
RECODE V10 (-1 = -9).
RECODE V11 (-50.00 = -9).
Как я могу захватить и заменить как -50,00, так и -33,33 для «линии» V11?
Изменить: я хочу, чтобы мой вывод выглядел так:
VALUE LABELS V10
-9 "Missing"
1 "Yes".
VALUE LABELS V11
-9 "Missing"
-9 "Missing"
-10 "Don't Know".
RECODE V10 (-1 = -9).
RECODE V11 (-50.00 = -9).
RECODE V11 (-33.33 = -9).