From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

#!./perl -w
#
# Check that utf8.pm and its dependencies only use the subset of the
# $1..$n capture vars that Perl_save_re_context() is hard-coded to
# localise, because that function has no efficient way of determining at
# runtime what vars to localise.
#
# Note that this script tests for the existence of symbol table entries in
# %::, so @4 etc would trigger a failure as well as $4.
#
# If tests start to fail, either (in order of descending preference):
#
# * fix utf8.pm or its dependencies so that any recent change no longer
# uses more special vars (ideally it would use no vars);
#
# * fix Perl_save_re_context() so that it localises more vars, then
# update this test script with the new relaxed var list.
use strict;
# trigger the dependency loading
my $x = lc "\x{411}";
# determine which relevant vars those dependencies accessed
my @vars =
grep !/^[0123]$/, # $0, and $1, ..$3 allowed
grep /^(?:\d+|[`'&])$/, # numeric and $`, $&, $' vars
sort keys %::;
# load any other modules *after* calculating @vars
require './test.pl';
plan(1);
is(scalar @vars, 0, "extraneous vars")
or diag("extra vars seen: " . join(", ", map "*$_", @vars));
exit 0;