perl -> печать символов между несколькими метасимволами в одной строке - PullRequest
0 голосов
/ 24 января 2020

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

Файл: | | B | Количество | D | E |

Ожидаемый результат: AB Count DE

if($line =~ /\|/) 
{
while ($line =~ m/\|/g) 
{
my $start_pos = $-[0]; 
my $end_pos = $+[0]; 
my $hit_pos = "$start_pos - $end_pos";
my $char = substr($line, $start_pos, $end_pos);
if($char =~/\w/){
  print "$char\n";
}
}
}

Ответы [ 2 ]

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

Использование split:

my $line = '| A| B| Count| D| E|';

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

say "<$_>" for @fields;

Выход:

< A>
< B>
< Count>
< D>
< E>

Использование соответствия регулярному выражению:

my $line = '| A| B| Count| D| E|';

my @fields = $line =~ / \| ([^|]*) (?=\|) /xg;

say "<$_>" for @fields;

Выход:

< A>
< B>
< Count>
< D>
< E>

Использование соответствия регулярному выражению (альтернатива):

my $line = '| A| B| Count| D| E|';

while ($line =~ / \| ([^|]*) (?=\|) /xg) {
   say "<$1>";
}

Вывод:

< A>
< B>
< Count>
< D>
< E>
1 голос
/ 24 января 2020

Возможно, проще всего было бы просто удалить трубы.

$line =~ s/\Q|\E//g;
...