Forum: Ruby expanding environment variable

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Daniel S. (Guest)
on 2009-03-03 16:29
Hi,

I have a string
s = "$DIR/test/$FILE"

Is there an easy way to expand this with the defined environment
variables?
I can always write a quick parser, but I was wondering maybe this
already exists?

Thanks
ds
Dominik H. (Guest)
on 2009-03-03 16:54
(Received via mailing list)
On [Tue, 03.03.2009 23:28], Daniel S. wrote:
> Hi,
>
> I have a string
> s = "$DIR/test/$FILE"
>
> Is there an easy way to expand this with the defined environment
> variables?
What do you mean by environment variables? The stuff in ENV, or the
constants like __FILE__ or simply global variables?
Daniel S. (Guest)
on 2009-03-03 16:59
Dominik H. wrote:
> On [Tue, 03.03.2009 23:28], Daniel S. wrote:
>> Hi,
>>
>> I have a string
>> s = "$DIR/test/$FILE"
>>
>> Is there an easy way to expand this with the defined environment
>> variables?
> What do you mean by environment variables? The stuff in ENV, or the
> constants like __FILE__ or simply global variables?

I mean the stuff in ENV.
SHELL:
export DIR=x
export FILE=y.z

RUBY:
I'd like to know the easiest way from
 s = "$DIR/test/$FILE"
to
 s = "x/test/y.z"
Dominik H. (Guest)
on 2009-03-03 17:11
(Received via mailing list)
On [Tue, 03.03.2009 23:58], Daniel S. wrote:
> > constants like __FILE__ or simply global variables?
>  s = "x/test/y.z"
>
>
| >>> DIR=x FILE=y.z irb
| >> s = "$DIR/test/$FILE".gsub(/\$\w+/) {|m| ENV[m[1..-1]]}
| => "x/test/y.z"

Thats how I would do it.
Daniel S. (Guest)
on 2009-03-03 17:17
Dominik H. wrote:

> | >>> DIR=x FILE=y.z irb
> | >> s = "$DIR/test/$FILE".gsub(/\$\w+/) {|m| ENV[m[1..-1]]}
> | => "x/test/y.z"
>
> Thats how I would do it.

Perfect, thanks. I sometimes have a hard time with those efficient
one-liners. It's all so cryptic.
Brian C. (Guest)
on 2009-03-03 17:48
Dominik H. wrote:
> On [Tue, 03.03.2009 23:58], Daniel S. wrote:
>> > constants like __FILE__ or simply global variables?
>>  s = "x/test/y.z"
>>
>>
> | >>> DIR=x FILE=y.z irb
> | >> s = "$DIR/test/$FILE".gsub(/\$\w+/) {|m| ENV[m[1..-1]]}
> | => "x/test/y.z"
>
> Thats how I would do it.

Or: s = "$DIR/test/$FILE".gsub(/\$(\w+)/) { ENV[$1] }
Dominik H. (Guest)
on 2009-03-03 17:51
(Received via mailing list)
On [Wed, 04.03.2009 00:16], Daniel S. wrote:
> Perfect, thanks. I sometimes have a hard time with those efficient
> one-liners. It's all so cryptic.

Well, the only really cryptic thing about this one is the regexp, but
thats just a matter of learning regular expressions. And well, the
rest are basic ruby idioms/features like blocks. Comes time comes
knowledge, you will get used to those one-liners :)
Dominik H. (Guest)
on 2009-03-03 17:52
(Received via mailing list)
On [Wed, 04.03.2009 00:46], Brian C. wrote:
> > Thats how I would do it.
>
> Or: s = "$DIR/test/$FILE".gsub(/\$(\w+)/) { ENV[$1] }
Probably depends on whether you like global variables or not. It is
definitely shorter/more readable and I actually didn't know if gsub
sets $1.
Daniel S. (Guest)
on 2009-03-03 18:26
Dominik H. wrote:
> On [Wed, 04.03.2009 00:16], Daniel S. wrote:
>> Perfect, thanks. I sometimes have a hard time with those efficient
>> one-liners. It's all so cryptic.
>
> Well, the only really cryptic thing about this one is the regexp, but
> thats just a matter of learning regular expressions. And well, the
> rest are basic ruby idioms/features like blocks. Comes time comes
> knowledge, you will get used to those one-liners :)

That is true. I'm used to the old-fashioned programming of C, assembly
and such. There, things go with baby-steps, you do one little thing at a
time.
All of a sudden with perl/ruby and such you can do tons of stuff with
few lines. My brain is not wired for this. I have a hard time forming a
ruby-worthy solution around a problem, as I'm always falling back to C's
small step way of thinking. But you're right, comes time comes
knowledge.
Gary W. (Guest)
on 2009-03-03 18:33
(Received via mailing list)
On Mar 3, 2009, at 10:50 AM, Dominik H. wrote:
>> Or: s = "$DIR/test/$FILE".gsub(/\$(\w+)/) { ENV[$1] }
> Probably depends on whether you like global variables or not. It is
> definitely shorter/more readable and I actually didn't know if gsub
> sets $1.

$1 isn't a true global variable.  It is a per-thread variable.  It
still is a bit 'magic' for many people's tastes but it isn't as bad
as a true global.

Gary W.
Robert K. (Guest)
on 2009-03-03 19:40
(Received via mailing list)
On 03.03.2009 15:58, Daniel S. wrote:
>> constants like __FILE__ or simply global variables?
>  s = "x/test/y.z"
Just wondering: is there anything that would prevent doing this:

s = "#{ENV["DIR"]/test/#{ENV["FILE"]}"

or even

s = File.join ENV["DIR"], "test", ENV["FILE"]

?  In other words: is the format of your original string mandatory?  If
not, I'd rather choose one of the other approaches.

Kind regards

  robert
Rick D. (Guest)
on 2009-03-03 20:06
(Received via mailing list)
On Tue, Mar 3, 2009 at 11:30 AM, Gary W. <removed_email_address@domain.invalid> 
wrote:

> $1 isn't a true global variable.  It is a per-thread variable.  It
> still is a bit 'magic' for many people's tastes but it isn't as bad
> as a true global.
>

Actually its really a frame local variable. heres a bit of artificial
code
which illustrates this:

def m1(string)
  string.scan(/(ab|ac)/) {|m|
    puts "in m1 $1 is #{$1}"
    result = m2($1)
    puts "result is #{result}, $1 is #{$1}"
    }
end

def m2(string)
  "z#{string}".scan(/(za)/) {|m|
    puts "in m2 $1 is #{$1}"
    $1
  }
end

m1("abcac") # => "abcac"
# >> in m1 $1 is ab
# >> in m2 $1 is za
# >> result is zab, $1 is ab
# >> in m1 $1 is ac
# >> in m2 $1 is za
# >> result is zac, $1 is ac


--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale
Peña, Botp (Guest)
on 2009-03-04 04:14
(Received via mailing list)
From: Daniel S. [mailto:removed_email_address@domain.invalid]
# Dominik H. wrote:
# > | >>> DIR=x FILE=y.z irb
# > | >> s = "$DIR/test/$FILE".gsub(/\$\w+/) {|m| ENV[m[1..-1]]}
# > | => "x/test/y.z"
# Perfect, thanks. I sometimes have a hard time with those
# efficient one-liners. It's all so cryptic.


if we are careful w constants (wc we should), we can do,

  s = "DIR/test/FILE".gsub(/[A-Z]+/) {|m| ENV[m]}

(ok, ok, you guessed it, i hate dollar notations =)

kind regards -botp
This topic is locked and can not be replied to.