use warnings; use strict; use Test::More; sub testre; # The "normal" solution my $re = join '|', map {quotemeta} qw/a . | %/; testre qr/$re/i ; # The "hacked" solution testre qr{@{[ join '|', map {quotemeta} qw/a . | %/ ]}}i ; # Wouldn't this be a bit nicer? #testre qr{ join '|', map {quotemeta} qw/a . | %/ }ei ; # ### Update ### # Thanks to LanX sub qre (&;$) { my $re = shift->(); eval 'qr/$re/'.(shift//'') || die $@ } testre qre{ join '|', map {quotemeta} qw/a . | %/ }'i' ; # Thanks to Haarg testre map qr/$_/i, join '|', map {quotemeta} qw/a . | %/ ; # Thanks to vr testre qr{(??{ join '|', map {quotemeta} qw/a . | %/ })}i ; done_testing; sub testre { my $re = shift; diag explain $re; is ref $re, 'Regexp'; like $_, $re for qw/A . | %/; unlike 'bcd', $re; }