как получить позицию символа и его другое вхождение и распечатать между двумя позициями в каждой строке в файле, используя perl - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь написать скрипт, который бы получил позицию "|" персонаж и следующий "|" и сохраните символы между этими двумя позициями из каждой строки в массив.

Файл:

  | A| D| MUL|
  | D| I|    |
  | D| V|    |

ожидаемый результат: ADD DIV MUL

Я попробовал приведенный ниже код , могут быть некоторые проблемы в циклах while и $ prev_pos, установленном в 0.

open ($file, "<$i") or die "couldn't open list";
    my $prev_pos=0;
    my @store;
    my $char ;
    while(my $line=<$file>) 
    {
    while ($line =~ /\|/g) {
      my $pos=$-[0];
      my $char = substr($line, $prev_pos+1, $pos-$prev_pos+1);
      print "$char\n";
      if($char =~ /\w/)
      {
        my $prev_char = @store[$pos+1]; 
        @store[$pos+1] = join('',$prev_char,$char);
      }
      my $prev_pos = $pos;
    }
    }
    }
    }
    close $file;

Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Из предыдущего вопроса , вы уже знаете, как анализировать отдельные строки:

my @fields = split(/\|/, $line, -1);
shift(@fields);  # Ignore stuff before first "|"
pop(@fields);    # Ignore stuff after last "|"

Итак, ваш вопрос касается объединения элементов двух массивов, индексация по индексу .

my @merged;
while (<>) {
   chomp;

   my @fields = split(/\|/, $line, -1);
   shift(@fields);  # Ignore stuff before first "|"
   pop(@fields);    # Ignore stuff after last "|"

   s/^\s+|\s+\z//g for @fields; # Remove leading and trailing spaces.

   for my $i (0..$#fields) {
      $merged[$i] .= $fields[$i];
   }
}

say for @merged;
2 голосов
/ 27 января 2020

Ты слишком усложняешь это. split принимает регулярное выражение и захватывает значения в список.

Затем можно объединить последующие строки, используя . для объединения текста:

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

use Data::Dumper;

my @merged;

#iterate filehandle line by line - I use the special DATA Filehandle here, 
#you should probably use the results of an 'open'.     
while ( <DATA> ) {
   my $index = 0; 
   #split the current row on pipe-char "|" and iterate
   for my $value ( split /\|/ ) {
     #use .= to concatenate the value in the @merged array. 
     $merged[$index++] .= $value;
   }
}

#strip whitespace:
s/\s+//g for @merged;

#debug, so you can see what's actually being produced.
#note the zero length fields - those are the first and last column. 
print Dumper \@merged;

#results: (note - probably includes empty values and linefeeds that you
#may need to sanitise). 
print "@merged";

__DATA__
  | A| D| MUL|
  | D| I|    |
  | D| V|    |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...