Извлечение Perl между началом и концом

Я стремлюсь извлечь строку от начала до конца слова, (dIonly является началом и должно быть конечным рабочим набором [включая эти круглые скобки]; Кроме того, я хотел бы напечатать вывод в файл с именем report, У меня были проблемы с lookbehind, так как переменная длина не была реализована. Теперь я перевернул строку, чтобы посмотреть вперед. Однако что-то все еще не работает.

Мне нужно начинать с dIonly, что означает, что мне нужно повернуть строку вспять, чтобы обойти описанную выше проблему, поскольку существует много рабочих наборов ((во всей строке, что означает, что я не могу начать с этого...

Спасибо! Я редактировал скрипт сейчас. Что мне нужно сделать, это перевернуть строку. Я сделал это, разделив строку с пробелом в качестве разделителя в списке, затем перевернул ее и снова поместил в строку. Просто снова разделить его на список в "решении" разделителя, так как мой вывод будет содержать несколько строк, которые я хочу извлечь только для рабочего набора (это работает только после того, как строка перевернута, иначе я бы предпочел рабочие наборы, которые мне не нужны и извлеките другую строку, так как dIonly является отдельной частью шаблона решения, из которого я могу перейти ко второму рабочему набору (который сам по себе является первым рабочим набором с двумя круглыми скобками). Затем я хочу напечатать его на новом выводе файл. Любые предложения приветствуются!

Это образец данных:... означает, что он продолжается после

..... maxRiskC(cA, 3)) c workset((RiskCA(cA, 3), RiskCB(cB, 2), maxRiskC(cA, 3))) c RiskCA(cA, 3) c RiskCB(cB, 2)) ***********

уравнение (встроенное уравнение для символа <=) 6 <= 40 ---> правда Решение 4 (состояние 31) сообщает: 40 перезаписывается: 8421 в 5357394502 мс процессор (1464 мс реальный) (0) перезаписывается / сек) G:Game --> рабочий набор (пустой) c воспроизведением

#!/usr/bin/perl
# perl -d ./perl_debugger.pl


use strict;
use Data::Dumper qw(Dumper);
use File::Slurp;


my @a_linesorig;
my @a_out;
my @a_str;
my $line;
my $reversedline;
my @a_linesrev;
my @reversedarray;
my $reversedline;
my $str;

open(my $fh, "<", "data.txt")
    or die "cannot open < data.txt: $!";


    my $line = read_file('data.txt');


   @a_linesorig = split(' ', $line);
   @a_linesrev = reverse(@a_linesorig);
   $reversedline = join(' ', @a_linesrev); # joins the reversed list to a single string again
   @reversedarray = split( /solution/, $reversedline ); # should split huge string into a list from one solution to next


    foreach $str (@reversedarray)  {
      if ($str =~ /\bdIonly:\b(.*?)\bworkset\b/g);      
         print Dumper \$str;
         print (@a_out, "$str");

       }  





close $fh
  or die "can't close file: $!";

open(my $fh, ">", "output.txt")
    or die "cannot open > output.txt: $!";

foreach $str (@a_out)
{
   print ($fh "$str\n");
}

close $fh
  or die "can't close file: $!";

1 ответ

Снимите обратное, он также будет переворачивать буквы, а не отдельные слова, для этого скаляра. Вы можете попробовать это с жадным совпадением, так как вас интересует только последний рабочий набор:

while (my $line = <$input>) { 
    chomp $line;
    if ($line =~ /.*workset(.*dIonly)/) {
            # do something with results
            say $fh "'$1'";
            }
}

И если вам нужно обратить вспять перед записью в файл, вы можете сделать:

while (my $line = <$input>) { 
    chomp $line;
    if ($line =~ /.*workset(.*dIonly)/) {
            say $fh join " ",reverse (split / /,$1);
            }
}
Другие вопросы по тегам