use 5.20.0; undef $/; my $code = <>; $code =~ s/\b([a-d])\b/\$$1/g; $code =~ s/cpy (\S+) (\S+)/$2 = $1/g; $code =~ s/inc (\S+)/$1++/g; $code =~ s/dec (\S+)/$1--/g; my $i = 1; $code = join "\n", map { $_->[1] } map { $_->[1] =~ s/jnz (\S+) (\S+)/"if($1){ goto LINE_" . ( $_->[0] + $2 ) . "}"/e; $_ } map { $_->[1] = "LINE_" . $_->[0] . ': ' . $_->[1]; $_ } map { [ $i++, $_ ] } grep { length } split /\n/, $code; $code =~ s/$/;/mg; my( $c, $d) = ( 1,0); eval $code; die $@ if $@; say $a; __END__ use Scalar::Util qw/ looks_like_number /; my $i = 0; my @instructions = map { "LINE_" . $i++ . ': ' . $_ } <>; my %reg; while ( my $c = $instructions[$i++] ) { say $i; use DDP; p %reg; if( $c =~ /cpy (\S+) (.)/ ) { $reg{$2} = looks_like_number($1) ? $1 : $reg{$1}; } elsif ( $c =~ /(inc|dec) (.)/ ) { $reg{$2} += ($1 eq 'inc') ? 1 : -1; } elsif( $c =~ /jnz (.) (.*)/ ) { $i += -1 + $2 if $reg{$1}; } else { die } my $x = ; } say $reg{a};