in reply to stuck with a \N{CHAR NAME} problem

{ use charnames ":alias" => { FOO => 0x2660 }; my $pat1 = '\N{FOO}'; $re1 = qr/$pat1/; } { use charnames ":alias" => { FOO => 0x2661 }; my $pat2 = '\N{FOO}'; $re2 = qr/$pat2/; } { use charnames ":alias" => { FOO => 0x2662 }; /$re1$re2/ }

What should the pattern match? Probably /\N{U+2660}\N{U+2661}/, but the information is not available to qr// at run-time, much less to the m// operator that's not in scope of the relevant directives.

Those problems were resolved by converting \N{NAME} to \N{U+NUM} at compile-time, and throwing an error when presented with \N{NAME} at run-time.

"\N{NAME}" works. qr/\N{NAME}/ works. Others, not so much.

Replies are listed 'Best First'.
Re^2: stuck with a \N{CHAR NAME} problem
by tchrist (Pilgrim) on May 26, 2011 at 17:52 UTC
    Alias games aside, I have yet to read any argument for why \N{NAME} should not simply use the currently active charmap, and/or autoload the :full one. This would handle all but the rarest sitatuations, and it would make Perl stop violating the principle of least surprise. In other words, instead of generating an exception like
    Constant(\N{NAME}) unknown: (possibly a missing "use charnames ...")
    It should in that situation implicitly do a
    use charnames ":full";
    and get on with it. In other words, if you need a charmap and don't have one, just load what everybody is expecting.

      Auto-loading :full would be most desireable, but it wouldn't help here.

      It seems to me the OP's issue could be resolved by attaching charnames data to statements (just like strict flags). Then, qr// could translate \N{NAME} to \N{U+NUM} at run-time just like it does at compile-time. That would even handle aliases. Is that hard to do?