How to set $_ in a method?

Hi all,

I like to set caller’s $_ variable in a method, but it did’t work for
me.
Consider this:

def foo
puts "$_ = #{$.inspect} enter foo"
$
= ‘def’
puts “$_ = #{$_.inspect} exit foo”
end

$_ = ‘abc’
puts “$_ = #{$.inspect} before foo"
foo
puts "$
= #{$_.inspect} after foo”

The result is:
$_ = “abc” before foo
$_ = nil enter foo
$_ = “def” exit foo
$_ = “abc” after foo

I noticed $_ is is local to the current scope.
Is it impossible to set the caller’s $_ variable in a method without
using binding and eval?

Thanks,

Park H.

Hi,

Am Freitag, 12. Jun 2009, 16:45:51 +0900 schrieb Heesob P.:

I like to set caller’s $_ variable in a method, but it did’t work for me.
[…]
I noticed $_ is is local to the current scope.
Is it impossible to set the caller’s $_ variable in a method without
using binding and eval?

$_ has some special meanings in Kernel.gets, Kernel.sub, Regexp#~
etc. This comes in handy for -ne/-pe option oneliners. You
shouldn’t use it outside that (if you don’t know what you do).

Bertram

On Fri, Jun 12, 2009 at 8:55 AM, Daniel B.[email protected]
wrote:

The rb_lastline_set() call sets $_. What’s the equivalent in pure Ruby? If
it’s possible to do within a C extension, it ought to be possible to do in
pure Ruby.

It is not possible, which is why backref and lastline should be
banned. $_ and $~ are treated specially and can only be set across
calls from C code (or Java code in JRuby).

  • Charlie

me.

[…]
I noticed $_ is is local to the current scope.
Is it impossible to set the caller’s $_ variable in a method without
using binding and eval?

$_ has some special meanings in Kernel.gets, Kernel.sub, Regexp#~
etc. This comes in handy for -ne/-pe option oneliners. You
shouldn’t use it outside that (if you don’t know what you do).

Except we’re trying to match the zlib.c spec. Specifically,
rb_gzreader_gets() in zlib.c:

static VALUE
rb_gzreader_gets(argc, argv, obj)
int argc;
VALUE *argv;
VALUE obj;
{
VALUE dst;
dst = gzreader_gets(argc, argv, obj);
if (!NIL_P(dst)) {
rb_lastline_set(dst);
}
return dst;
}

The rb_lastline_set() call sets $_. What’s the equivalent in pure Ruby?
If
it’s possible to do within a C extension, it ought to be possible to do
in
pure Ruby.

Regards,

Dan