expanding environment variable

D

Daniel Schoch

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
 
D

Daniel Schoch

Dominik said:
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"
 
D

Daniel Schoch

Dominik said:
| >>> 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.
 
D

Daniel Schoch

Dominik said:
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.
 
G

Gary Wright

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 Wright
 
R

Robert Klemme

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"

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
 
R

Rick DeNatale

[Note: parts of this message were removed to make it a legal post.]

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.

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
 
P

Peña, Botp

RnJvbTogRGFuaWVsIFNjaG9jaCBbbWFpbHRvOnRyYXNoQHRla3dpc3N1c2EuY29tXSANCiMgRG9t
aW5payBIb25uZWYgd3JvdGU6DQojID4gfCA+Pj4gRElSPXggRklMRT15LnogaXJiDQojID4gfCA+
PiBzID0gIiRESVIvdGVzdC8kRklMRSIuZ3N1YigvXCRcdysvKSB7fG18IEVOVlttWzEuLi0xXV19
DQojID4gfCA9PiAieC90ZXN0L3kueiINCiMgUGVyZmVjdCwgdGhhbmtzLiBJIHNvbWV0aW1lcyBo
YXZlIGEgaGFyZCB0aW1lIHdpdGggdGhvc2UgDQojIGVmZmljaWVudCBvbmUtbGluZXJzLiBJdCdz
IGFsbCBzbyBjcnlwdGljLg0KDQoNCmlmIHdlIGFyZSBjYXJlZnVsIHcgY29uc3RhbnRzICh3YyB3
ZSBzaG91bGQpLCB3ZSBjYW4gZG8sDQoNCiAgcyA9ICJESVIvdGVzdC9GSUxFIi5nc3ViKC9bQS1a
XSsvKSB7fG18IEVOVlttXX0NCg0KKG9rLCBvaywgeW91IGd1ZXNzZWQgaXQsIGkgaGF0ZSBkb2xs
YXIgbm90YXRpb25zID0pDQoNCmtpbmQgcmVnYXJkcyAtYm90cA0KDQoNCg0KDQoNCg0K
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top