#! /usr/bin/perl
($dpos, $data, $/) = (0, "");
sub data :lvalue { vec($data, $dpos, 8) }
<> =~ m{
(?: [>] (?{++$dpos}) | [+] (?{++(data)}) | [.] (?{print chr data}) |
[<] (?{--$dpos}) | [-] (?{--(data)}) | [,] (?{data= ord getc}) |
[[] (?(?{data})(?0)|(?1)) []] | [^][<>.,+-]
)*+\z | (?(?{data})(?0)|(?1)) | \z((?: [^][] | [[] (?1) []])*) }x;
BEGIN { *ARGV = *DATA unless @ARGV }
__DATA__
+++++[>+++++++++<-],[[>--.++>+<<-]>+.->[<.>-]<<,]
####
$ perl -w bf.pl <(perl bf.pl < bf.pl)
Complex regular subexpression recursion limit (32766) exceeded at bf.pl line 5, <> chunk 1.
...
####
sub data :lvalue { vec($data,$dpos,8) } # v5.16.1--OK; v5.12.3--Fail
sub data :lvalue { vec($data,$dpos,8) //= 0 } # OK
my @data;
sub data :lvalue { $data[$dpos] &= 255 } # OK