Если вы просматриваете файл построчно, вы можете сохранить частичные строки в переменной и объединить их со следующей строкой. Прочтите код - я прокомментировал функциональность.
my $curr;
my $txt;
open ( IN, "<", 'yourinputfile.txt' ) or die 'Could not open file: ' . $!;
while (<IN>) {
chomp;
# if the line ends with a backslash, save the segment in $curr and go on to the next line
if ( m!(.*?) \$! ) {
$curr = $1;
next;
}
# if $curr exists, add this line on to it
if ( $curr ) {
$curr .= $_;
}
# otherwise, set $curr to the line contents
else {
$curr = $_;
}
if ( $curr =~ /set_case_analysis -name\s+\"?(\S+)/) {
# if the string is in quotes, the regex will leave the final " on the string
# remove it
( $txt = $1 ) =~ s/"$//;
print "Set Case $txt\n";
$set_case_analysis{$txt}=1;
}
elsif ($curr =~ /quasi_static -name\s+(\S+)/) {
( $txt = $1 ) =~ s/"$//;
print "Quasi Static $txt\n";
$quasi_static{$txt}=1;
}
elsif ($curr =~ /reset .*?-name\s+\"?(\S+)/) {
( $txt = $1 ) =~ s/"$//;
print "Reset $txt\n";
$reset{$txt}=1;
}
# reset $curr
$curr = '';
}
Вы можете сделать его более компактным и аккуратным, сделав что-то вроде этого:
if ( $curr =~ /(\w+) -name \"?(\S+)/) {
( $txt = $2 ) =~ s/"$//;
$data{$1}{$txt}=1;
}
Вы получите вложенную хеш-структуру с тремя ключами set_case_analysis
, quasi_static
и reset
и различными значениями из -name
.
%data = (
quasi_static => ( foo => 1, bar => 1 ),
reset => ( pip => 1, pap => 1, pop => 1 ),
set_case_analysis => ( foo => 1, bar => 1 )
);
person
i alarmed alien
schedule
07.08.2018