The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;

use Language::Expr;
use POSIX;
use Test::Exception;
use Test::More;

my @data = (
    {category=>'none', text=>'[]', result=>[]},
    {category=>'none', text=>'1+2+3', result=>[]},

    {category=>'basic', text=>'$b', result=>['b']},
    {category=>'basic', text=>q[${a b}], result=>['a b']},
    {category=>'basic', text=>'$a+2*$b', result=>['a', 'b']},

    {category=>'repeat', text=>'$b+$b*$b', result=>['b']},

    {category=>'quotestr', text=>q("${a b} $c" . '$d'), result=>['a b', 'c']},

    {category=>'func', text=>'length($a)', result=>['a']},

    {category=>'subscript', text=>'$a::b[$b]+([1, 2, $b::c])[$a]', result=>['a::b', 'b', 'b::c', 'a']},

);

my $ve = Language::Expr->new->get_interpreter('var_enumer');

for (@data) {
    is_deeply($ve->eval($_->{text}), $_->{result}, "$_->{category} ($_->{text})");
}

DONE_TESTING:
done_testing;