Expanding environment variable


#1

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


#2

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?


#3

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”


#4

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.


#5

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.


#6

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] }


#7

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 :slight_smile:


#8

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.


#9

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 :slight_smile:

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.


#10

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.


#11

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


#12

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


#13

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