From: Steve Pauly on
Jean-Julien Fleck wrote:
>> script1=["touch ~/ruby/f1;touch ~/ruby/f2"] � �#addl array elements to
>> But why do the files f1 and f2 not get created?
>
> Does the directory ~/ruby/ already exist on your machine ?
>
> Cheers,

Yes. It is where the ruby script is stored so I know it exists.
Thanks.

--
Posted via http://www.ruby-forum.com/.

From: Steve Pauly on
Brian Buckley wrote:
>> #!/usr/bin/ruby
>> script1=["touch ~/ruby/f1;touch ~/ruby/f2"] #addl array elements to
>> be added
>> puts script1[0].split(/;/) do |k|
>> puts k
>> system(k)
>> end
>> ----
>
>
>> The output from "puts k" looks good.
>
> Your block is not being called. I think the output you are seeing the is
> from the first "puts", not the "puts" inside the block.
>
> You need to call "each" on the Array returned by split, like this:
>
> puts script1[0].split(/;/).each do |k|
> puts k
> system(k)
> end
>
> --Brian

Brian, you were right.

Stupid of me not to think of the .each method.

Thank you!
Steve.

revised script:

script1=["touch /home/holocene/ruby/f1;touch /home/holocene/ruby/f2"]
script1.length.times do |cnt|
puts "script1 item #{cnt}"
script1[0].split(/;/).each do |k|
puts k
system(k)
end

end

--
Posted via http://www.ruby-forum.com/.

From: Steve Pauly on
Josh Cheek wrote:
> On Thu, Jul 1, 2010 at 7:02 PM, Josh Cheek <josh.cheek(a)gmail.com> wrote:
>
>>> #!/usr/bin/ruby
>>>
>> It has to do with block bindings. do ... end bind to the furthest left
>> script1=["touch ~/ruby/f1;touch ~/ruby/f2"] #addl array elements to be
>> added
>> puts script1[0].split(/;/) do |k|
>> puts k
>> system(k)
>> end
>>
>>
>>
>
> Here is a solution that creates the files.
>
> ----------
>
> script1=["touch ~/f1;touch ~/f2"] #addl array elements to be added
> script1[0].split(/;/).each do |k|
> puts k
> system k
> end
>
> ----------
>
> Note that {} has the kind of binding that you were looking for, but that
> split does not take a block (which is why I added the each method).
>
> though I don't understand your format, are you wanting them to be
> separated
> by being elements in an array, or by splitting a string on semicolons?

My idea, as a learning exercise only,was to prove to myself that I could
use an array of strings to contain "multiple" bash commands in "each"
array element. Of course, my use of a ";" to delimit is probably ill
advised, but was done merely for a proof of concept.

Now that with the addition of ".each", it works and mystery (for me)
solved.

I will have to study your code below more.

Thanks to all.
Steve.




> Right
> now, any other elements in this array will be ignored, because you only
> look
> at the one in index zero. (what is the point of the Array?)
>
> But you also have an issue if you split on semicolons, that assumes all
> semicolons are valid delimiters. Depending on context, this may not be
> the
> case. For example, what if the String was:
> %{echo "if ARGV.empty? ; puts 'no args' else puts 'got args' end" >
> argchecker.rb ; ruby argchecker.rb 1 2 3 ; ruby argchecker.rb}
>
> Then you want it to find these commands
> [
> "echo \"if ARGV.empty? ; puts 'no args' else puts 'got args' end\" >
> argchecker.rb ",
> " ruby argchecker.rb 1 2 3 ",
> " ruby argchecker.rb"
> ]
>
> But split(';') will give you these commands
> [
> "echo \"if ARGV.empty? ",
> " puts 'no args' else puts 'got args' end\" > argchecker.rb ",
> " ruby argchecker.rb 1 2 3 ",
> " ruby argchecker.rb"
> ]
>
>
> I think the best solution (easiest to implement, least likely to have
> bugs,
> most straightforward) is to keep each command separated in the Array,
> and
> not try to pull them from the string. If you do need to do that, you
> must
> either be careful to avoid using a semicolon in a way that is not a
> command
> delimiter, or you must find/write a parser so that you can determine
> where
> commands begin and end. I suppose you could also pick a different
> delimiter
> that is really unlikely to ever show up outside of the delimiter
> context.
> Some obscure unicode character, maybe.

--
Posted via http://www.ruby-forum.com/.