Perl: the Markov chain saw PerlMonks

### Re^4: Generate a truth table from input string

by tachyon-II (Chaplain)
 on May 13, 2008 at 18:40 UTC ( #686342=note: print w/replies, xml ) Need Help??

```\$str =~ s/(\w+)'/!\$1/g;
\$str =~ s/\(([^\)]+)\)'/!(\$1)/g;

Replies are listed 'Best First'.
Re^5: Generate a truth table from input string
by ikegami (Pope) on May 13, 2008 at 18:43 UTC

It you're going to allow (a+b)' — the OP might be happy with only supporting /\w+'/ — you must allow (a*(b+c))' too.

Other than that, there are a few other problems. You don't handle xor, you assume the same precedence and associativity as Perl, and you don't generate a truth table. I presume that's intentional and that you're leaving those as an exercise to the reader, so I'm just documenting what's left to do.

```while(<DATA>){
my (\$re, \$term, @vars, %vars, \$loops);
s/\*/ && /g;
s/\+/ || /g;
s/(\w+)\s*'/!\$1/g;
\$re = qr{\((?:(?>[^()]+)|(??{\$re}))*\)};  # :-)
s/(\$re)\s*'/!\$1/g;
\$term = \$_;
@vars = \$_ =~ m/(\w+)/g;
\$vars{\$_}++ for @vars;
@vars = sort keys %vars;
s/(\w+)/\\$\$1/g;
printf "\n@vars = \$term";
@vars = map {"\\$\$_"}@vars;
\$loops .= "for \$_ (0..1) {\n" for @vars;
\$loops .= qq{printf "@vars = %d\n", eval;\n};
\$loops .= "}" for @vars;
do{ no strict 'vars'; eval \$loops };
die "Can't process \$term\$_\n\$@\n" if \$@;
}
__DATA__
a*b*!(c)
a'+b'+c'
!(a*b)
b^a
(a^b)'
(a+(a+b))'*c

I'm a total noob and want to understand this code line by line.Can anyone help?

Create A New User
Node Status?
node history
Node Type: note [id://686342]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (4)
As of 2021-06-19 20:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
What does the "s" stand for in "perls"? (Whence perls)

Results (93 votes). Check out past polls.

Notices?