in reply to Re: impose 'use bytes' on another package
in thread impose 'use bytes' on another package

Oops forget to post the workaround. All you have to do is get rid of the 1; in the Foo.pm
and eval the remaining content of the (no longer)Module.
$code = `cat Foo.pm`;$code =~ s/\n1;//s; eval $code;
Use it if a quick'n dirty solution is right for you. Otherwise I hope other monks come up with a cleaner solution.

Replies are listed 'Best First'.
Re^3: impose 'use bytes' on another package
by diotalevi (Canon) on Apr 06, 2006 at 00:42 UTC

    You don't have to remove trailing true value and it'd have been nicer if you avoided making a call to the shell and cat when there are perfectly good perl functions for such a thing. This is also a quick and dirty solution but it isn't as craptacular as yours.

    local @ARGV = "Foo.pm"; # TODO: make this search @INC local $/; eval "#line Foo.pm 1\nuse bytes;" . <>; die $@ if $@;

    ⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

      I agree your solution works better.
      use Foo; my ($foo) = grep {/Foo\.pm$/} values %INC; { # so that local can be local local @ARGV = $foo; local $/; eval "#line Foo.pm 1\nuse bytes;" . <>; } die $@ if $@; print Foo::len(); # prints 2
      In this version however you have to reuse the module, which can be problematic.

        You'll want to search @INC, not the values of %INC. %INC is what has been loaded in the current script and doesn't contain a list of directories to search.

        ⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

Re^3: impose 'use bytes' on another package
by CountZero (Bishop) on Apr 06, 2006 at 05:40 UTC
    Hardly practical if the module is a few thousands lines long, contaisn XS-code and calls in tons of other modules.

    CountZero

    "If you have four groups working on a compiler, you'll get a 4-pass compiler." - Conway's Law