заменить строку на строки, основанные на информации, извлеченной из этой строки с использованием Perl - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть файл со следующими строками:

первый шаблон:

    .comm   "8"
    ....
    .comm   "20"

второй шаблон:

    .comm   _resultAvg,8,4
    .comm   _resultSwap,8,4
    .comm   _resultMax,20,4

Я хочу заменить первый шаблон на:

    .data.32 0
    .data.32 0
    ...
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0

И 2-й шаблон как:

.data
_resultAvg:
    .data.32 0
    .data.32 0
.data
_resultSwap:
    .data.32 0
    .data.32 0
.data
_resultMax:
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0
    .data.32 0

Я могу выполнить первую задачу с помощью;

#!/usr/bin/perl
use warnings;
use strict;
use String::Interpolate;
my $j=0;

while (<>) {
    if (my ($string) = /^\s+\.comm\s+"(.*)"/) {
        for( $j=0; $j < ($string/4); $j = $j +1){
            print  "\t.data.32\t0\n";
        }
    } else {
        print;
    }
}

Как выполнить второе задание? То есть найти числовой, например, 20 и разделите его на 4, а затем начните с соответствующего числа строк ".data.32 0" после начала с соответствующего символа.

привет

1 Ответ

0 голосов
/ 06 ноября 2018

Вот модификация вашего кода для обработки второго случая:

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

while (<>) {
    if (my ($string) = /^\s*\.comm\s+(.*)/) {
        my $cnt;
        if ($string =~ /^"(\d+)"$/) {
            $cnt = $1 / 4;
        } elsif ($string =~ /^(.+),(\d+),(\d+)$/) {
            print ".data\n$1:\n";
            $cnt = $2 / $3;
        } 
        for (1 .. $cnt){
            print  "\t.data.32\t0\n";
        }
    } else {
        print;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...