Объединение двух разных строк в одну строку с использованием Perl - PullRequest
0 голосов
/ 25 октября 2019

У меня возникли проблемы при попытке объединить две многострочные строки в одну после выполнения регулярных выражений для этих строк. В качестве примера я начинаю с данных в этой форме:

TMS: xxxxxxx11110000

TDI: xxxxxxx00001111

TMS: xxxx00001111

TDI: xxxx11110000

Чтобы получить его в нужной мне форме, я ищу в файле ключевое слово «TMS:», извлекаю только данные, использую регулярные выражения для удаления «х», переворачиваю данные и затем помещаю каждый битна отдельной строке и сохраните его в строку. Результирующая строка будет выглядеть так:

0
0
0
0
1
1
1
1

Затем я ищу в файле «TDI:» и повторяю тот же процесс. Последним шагом было бы объединить первую строку со второй строкой, чтобы получить следующий вывод (с учетом приведенного выше примера):

01
01
01
01
10
10
10
10

10
10
10
10
01
01
01
01

Однако, когда я объединяю две строки, я получаю каксейчас вывод

0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0

1
1
1
1
0
0
0
0
0
0
0
0
1
1
1
1 

Есть ли способ получить искомый результат, не слишком меняя свой процесс? Я безуспешно пытался использовать команду split, команду chomp и т. Д.

Ответы [ 3 ]

1 голос
/ 25 октября 2019

То, что вы хотите, это операция zip. Удобно List :: MoreUtils предоставляет один для вас.

@x = qw/a b c d/;
@y = qw/1 2 3 4/;

# returns [a, 1], [b, 2], [c, 3], [d, 4]
@z = zip6 @x, @y;         

Чтобы получить входные данные для zip, либо поместите ваши результирующие значения в массив на первом месте, либо разбейте входную строку.

1 голос
/ 25 октября 2019

Было бы хорошо иметь минимальный пример, чтобы увидеть, как вы подходите к этой проблеме. Кроме того, в вашем входном файле есть много неясного. Например, TMS и TDI всегда сопряжены в файле, или вы должны проверить это? Будете ли вы всегда использовать следующий TDI экземпляр для сопряжения с предшествующим TMS событием или они могут быть более несвязанными? Всегда ли TMS предшествует TDI или их можно повернуть вспять?

Один простой способ сделать это, предполагая, что данные выглядят так, как вы указали в своем примере, может состоять в чтении каждой строки и сохраненииданные в одном массиве для строки TMS и один массив для строки TDI. Если оба массива заполнены, у нас есть пара для вывода, поэтому выведите пару и очистите массивы для следующих событий. В противном случае прочитайте следующую строку, чтобы получить данные TDI:

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

my (@first, @second);
while (my $elem = <DATA>) {
    ($elem =~ /^TMS/)
        ? (@first = read_string($elem))
        : (@second = read_string($elem));
    if (@second) {
        for my $index (0..$#first) {
            print "$first[$index]$second[$index]\n";
        }
        print "\n";
        @first = @second = ();
    }
}

sub read_string {
    my $string = shift;
    my @bits = grep {/\d/} split('', $string);
    return reverse(@bits);
}


__DATA__
TMS: xxxxxxx11110000
TDI: xxxxxxx00001111
TMS: xxxx00001111
TDI: xxxx11110000

Вывод этого будет:

01
01
01
01
10
10
10
10

10
10
10
10
01
01
01
01
0 голосов
/ 26 октября 2019

ответ Хоббса от Code Golf: Лазеры решали совершенно другую проблему, но часть решения была о том, как «вращать» многострочную строку, и это могло бы быть полезно здесь.

Во-первых, не помещайте каждый бит в отдельную строку, просто отделяйте биты от разных строк ввода в разных строках. Поместите многострочную строку в $_.

$_ = '0000111111110000
1111000000001111';

Теперь выполните следующий код:

$_ = do {
    my $o;
    $o .= "\n" while s/^./$o.=$&,""/meg;
    $o };

(подстановка в алгоритме Хоббса началась с s/.$/.../. Используя s/^./.../, он становится алгоритмом для транспонирования, а не для вращения)

Ввод:

$_ = '0000111111110000
1111000000001111';

Выход:

01
01
01
01
10
10
10
10
10
10
10
10
01
01
01
01

Этот алгоритм легко обобщается на любое числостроки и столбцы во входных данных.

входные данные:

$_='ABCDE
12345
FGHIJ
67890';

выходные данные:

A1F6
B2G7
C3H8
D4I9
E5J0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...