expanding environment variable

Discussion in 'Ruby' started by Daniel Schoch, Mar 3, 2009.

  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
    --
    Posted via http://www.ruby-forum.com/.
     
    Daniel Schoch, Mar 3, 2009
    #1
    1. Advertising

  2. Dominik Honnef wrote:
    > On [Tue, 03.03.2009 23:28], Daniel Schoch 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"


    --
    Posted via http://www.ruby-forum.com/.
     
    Daniel Schoch, Mar 3, 2009
    #2
    1. Advertising

  3. Dominik Honnef 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.
    --
    Posted via http://www.ruby-forum.com/.
     
    Daniel Schoch, Mar 3, 2009
    #3
  4. Dominik Honnef wrote:
    > On [Tue, 03.03.2009 23:58], Daniel Schoch 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] }
    --
    Posted via http://www.ruby-forum.com/.
     
    Brian Candler, Mar 3, 2009
    #4
  5. Dominik Honnef wrote:
    > On [Wed, 04.03.2009 00:16], Daniel Schoch 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.
    --
    Posted via http://www.ruby-forum.com/.
     
    Daniel Schoch, Mar 3, 2009
    #5
  6. Daniel Schoch

    Gary Wright Guest

    On Mar 3, 2009, at 10:50 AM, Dominik Honnef 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 Wright
     
    Gary Wright, Mar 3, 2009
    #6
  7. On 03.03.2009 15:58, Daniel Schoch wrote:
    > Dominik Honnef wrote:
    >> On [Tue, 03.03.2009 23:28], Daniel Schoch 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"


    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
     
    Robert Klemme, Mar 3, 2009
    #7
  8. [Note: parts of this message were removed to make it a legal post.]

    On Tue, Mar 3, 2009 at 11:30 AM, Gary Wright <> wrote:

    >
    > On Mar 3, 2009, at 10:50 AM, Dominik Honnef 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.
    >


    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
     
    Rick DeNatale, Mar 3, 2009
    #8
  9. RnJvbTogRGFuaWVsIFNjaG9jaCBbbWFpbHRvOnRyYXNoQHRla3dpc3N1c2EuY29tXSANCiMgRG9t
    aW5payBIb25uZWYgd3JvdGU6DQojID4gfCA+Pj4gRElSPXggRklMRT15LnogaXJiDQojID4gfCA+
    PiBzID0gIiRESVIvdGVzdC8kRklMRSIuZ3N1YigvXCRcdysvKSB7fG18IEVOVlttWzEuLi0xXV19
    DQojID4gfCA9PiAieC90ZXN0L3kueiINCiMgUGVyZmVjdCwgdGhhbmtzLiBJIHNvbWV0aW1lcyBo
    YXZlIGEgaGFyZCB0aW1lIHdpdGggdGhvc2UgDQojIGVmZmljaWVudCBvbmUtbGluZXJzLiBJdCdz
    IGFsbCBzbyBjcnlwdGljLg0KDQoNCmlmIHdlIGFyZSBjYXJlZnVsIHcgY29uc3RhbnRzICh3YyB3
    ZSBzaG91bGQpLCB3ZSBjYW4gZG8sDQoNCiAgcyA9ICJESVIvdGVzdC9GSUxFIi5nc3ViKC9bQS1a
    XSsvKSB7fG18IEVOVlttXX0NCg0KKG9rLCBvaywgeW91IGd1ZXNzZWQgaXQsIGkgaGF0ZSBkb2xs
    YXIgbm90YXRpb25zID0pDQoNCmtpbmQgcmVnYXJkcyAtYm90cA0KDQoNCg0KDQoNCg0K
     
    Peña, Botp, Mar 4, 2009
    #9
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Dmitri Zakharov
    Replies:
    2
    Views:
    6,522
    Dmitry Roslyakov
    Jun 11, 2004
  2. Replies:
    5
    Views:
    660
  3. idle
    Replies:
    8
    Views:
    291
    Max M
    Apr 9, 2008
  4. Tyson Marchuk
    Replies:
    7
    Views:
    131
    Brian McCauley
    Feb 24, 2004
  5. Replies:
    7
    Views:
    192
    Xicheng Jia
    May 3, 2007
Loading...

Share This Page