Извлечение 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);
}
}