FSM-Basic
view release on metacpan or search on metacpan
lib/FSM/Basic.pm view on Meta::CPAN
package FSM::Basic;
use 5.010;
use strict;
use warnings;
use Carp;
use Data::Dumper;
our $VERSION = '0.28';
sub new {
my ($class, $l, $s) = @_;
my $self;
$self->{states_list} = $l;
$self->{state} = $s;
foreach my $k1 (keys %{ $self->{states_list} }) {
if (exists $self->{states_list}{$k1}{expect}) {
foreach my $k2 (keys %{ $self->{states_list}{$k1}{expect} }) {
if (ref $self->{states_list}{$k1}{expect}{$k2} eq 'HASH'
&& exists $self->{states_list}{$k1}{expect}{$k2}{alternation})
{
if (defined $self->{states_list}{$k1}{expect}{$k2}{caseinsensitive}) {
$self->{states_list}{$k1}{expect}{ alter($k2, 1) } = delete $self->{states_list}{$k1}{expect}{$k2};
} else {
$self->{states_list}{$k1}{expect}{ alter($k2) } = delete $self->{states_list}{$k1}{expect}{$k2};
}
}
}
}
}
bless($self, $class);
return $self;
}
my @commands = qw(
cmd
cmd_exec
exec
cmd_regex
do
output
output_file
cat
more
catrand
catwrand
catseq
catseq_idx
catseqn
swapregex
matching
final
matching
caseinsensitive
alternation
);
sub qp(&){
my $s;
open local *STDOUT, '>', \$s or die "open in-memory file: $!";
&{$_[0]};
die $@ if $@;
$s;
}
sub run {
my ($self, $in) = @_;
my $in_lc = lc($in);
$in =~ s/([*?.])/\\$1/g;
my $rev;
my %extra;
if ($in !~ /^$/) {
foreach my $IN (grep { /^$in/i } keys %{ $self->{states_list}{ $self->{state} }{expect} }) {
if (ref $self->{states_list}{ $self->{state} }{expect}{$IN} eq 'HASH') {
$rev //= $IN if (defined $self->{states_list}{ $self->{state} }{expect}{$IN}{swapregex});
foreach my $key (keys %{ $self->{states_list}{ $self->{state} }{expect}{$IN} }) {
# carp "k=$key IN=$IN";
$extra{$key} = $self->{states_list}{ $self->{state} }{expect}{$IN}{$key} unless any($key);
}
}
}
}
# carp "state=".Dumper($self->{states_list});
my $output = '';
my $string;
if (exists $self->{states_list}) {
if ( exists $self->{states_list}{ $self->{state} }
&& exists $self->{states_list}{ $self->{state} }{repeat}
&& $self->{states_list}{ $self->{state} }{repeat} <= 0)
{
$self->{previous_state} = $self->{state};
$self->{state} = $self->{states_list}{ $self->{state} }{expect}{not_matching0} // $self->{states_list}{ $self->{state} }{not_matching0};
if (exists $self->{states_list}{ $self->{previous_state} }{not_matching_info_last}) {
$output = $self->{states_list}{ $self->{previous_state} }{not_matching_info_last};
}
$output .= $self->{states_list}{ $self->{state} }{output} // read_file($self->{states_list}{ $self->{state} }{output_file}) // '';
return ($self->{states_list}{ $self->{state} }{final} // 0, $output);
}
if (exists $self->{states_list}{ $self->{state} }{expect}) {
if (exists $self->{states_list}{ $self->{state} }{info}) {
$output = $self->{states_list}{ $self->{state} }{info} . $output;
}
if (exists $self->{states_list}{ $self->{state} }{info_once}) {
$output = delete($self->{states_list}{ $self->{state} }{info_once}) . $output;
}
my $state;
if ( exists $self->{previous_output}
&& $in eq ''
&& $self->{previous_output} =~ /\[(.+)\]/)
{
$in = $1;
}
my $match;
if (defined $rev) {
my $key = $rev;
my $r = $in;
$r = '(?i:' . $r . ')' if defined $self->{states_list}{ $self->{state} }{expect}{$rev}{caseinsensitive};
if ($r && $key =~ /^$r/) {
( run in 2.443 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )