Although may aspects of Ruby are inherited (in a non-OO way!) from Perl, there are some distinct differences too; a classic
for loop in Perl has its end condition checked every time around the loop, but a Ruby
for loop sets up an iterator at the start, so that if something changes within the loop evaluation context, the loop does not dynamically adjust. Let me show you an example.
Here's a
for loop in Ruby:
stuff = ["Tom","Dick","Harriet"]
for v in 0...stuff.length do
print "#{v+1} ... #{stuff[v]}\n"
stuff[stuff.length] = "Bob"
end
p stuff
In which the loop runs 3 times because
that's the number of times that's calculated before the loop starts.
Dorothy-2:ra10 grahamellis$ ruby evalo.rb
1 ... Tom
2 ... Dick
3 ... Harriet
["Tom", "Dick", "Harriet", "Bob", "Bob", "Bob"]
Dorothy-2:ra10 grahamellis$ ]
But in Perl,
using the classic from, to, step, the end condition is checked every time. So if we write the equivalent code in Perl:
@stuff = ("Tom","Dick","Harriet");
for ($v=0; $v<@stuff; $v++) {
print "$v >>> $stuff[$v]\n";
$stuff[@stuff] = "Bob";
}
print ("@stuff\n");
we get an infinite loop:
Dorothy-2:ra10 grahamellis$ perl evalo.pl
0 >>> Tom
1 >>> Dick
2 >>> Harriet
3 >>> Bob
4 >>> Bob
5 >>> Bob
6 >>> Bob
7 >>> Bob
8 >>> Bob
9 >>> Bob
etc ...
Which is right? Neither - or both - depending upon how you think of it. They're different - and if you're writing a loop which modifies its end condition in any language, you need to be sure how it will behave.
Perhaps it would be better for me to suggest to you that loops that dynamically change there end point in this way are best acoided!
(written 2010-04-07, updated 2010-04-08)
Associated topics are indexed under
R104 - Ruby - Control Structures [3422] Assigning values to variables within other statements - Ruby - (2011-09-07)
[3397] Does a for loop evaluate its end condition once, or on every iteration? - (2011-08-18)
[3254] Multiple inputs, multiple out, ruby functions - (2011-04-19)
[3253] Is this number between? Does this list include? - Ruby - (2011-04-18)
[3200] How a for loop works Java, Perl and other languages - (2011-03-12)
[3159] Returning multiple values from a function call in various languages - a comparison - (2011-02-06)
[3158] Ruby training - some fresh examples for string handling applications - (2011-02-05)
[3156] Splitting data reading code from data processing code - Ruby - (2011-02-04)
[2975] Why do I need brackets in Ruby ... or Perl, Python, C or Java - (2010-09-29)
[2892] Alternative loops and conditionals in Ruby and Perl - (2010-07-28)
[2619] Passing code to procedures and yield in Ruby - (2010-02-02)
[2471] A short form of if ... then ... else - (2009-10-23)
[2287] Learning to program in Ruby - examples of the programming basics - (2009-07-15)
[1904] Ruby, Perl, Linux, MySQL - some training notes - (2008-11-23)
[1891] Ruby to access web services - (2008-11-16)
[1887] Ruby Programming Course - Saturday and Sunday - (2008-11-16)
[1870] What to do with a huge crop of apples - (2008-11-04)
[1738] Clean code, jump free (Example in Lua) - (2008-08-06)
[1696] Saying NOT in Perl, PHP, Python, Lua ... - (2008-07-04)
[1587] Some Ruby programming examples from our course - (2008-03-21)
[1582] Ruby, C, Java and more - getting out of loops - (2008-03-19)
[1220] for loop - how it works (Perl, PHP, Java, C, etc) - (2007-06-06)
[1163] A better alternative to cutting and pasting code - (2007-04-26)
[995] Ruby's case - no break - (2006-12-17)
[985] Equality in Ruby - == eql? and equal? - (2006-12-14)
[962] Breaking a loop - Ruby and other languages - (2006-12-03)
[960] 1st, 2nd, 3rd revisited in Ruby - (2006-12-02)
P204 - Perl - Conditionals and Loops [3004] Increment operators for counting - Perl, PHP, C and others - (2010-10-18)
[2832] Are you learning Perl? Some more examples for you! - (2010-06-27)
[2550] Do not copy and paste code - there are much better ways - (2009-12-26)
[2351] Ternary operators alternatives - Perl and Lua lazy operators - (2009-08-12)
[1727] Equality and looks like tests - Perl - (2008-07-29)
[1607] Learning to program in Perl - (2008-04-11)
[1477] Decisions - small ones, or big ones? - (2007-12-18)
[1468] Lexical v Arithemetic testing, Bash and Perl - (2007-12-11)
[1191] Smart English Output - via PHP and Perl ? : operator - (2007-05-18)
[930] -> , >= and => in Perl - (2006-11-18)
[353] Wimbledon Neck - (2005-06-20)
P206 - Perl - More Loops and Conditionals [3398] Perl - making best use of the flexibility, but also using good coding standards - (2011-08-19)
[2972] Some more advanced Perl examples from a recent course - (2010-09-27)
[2967] Multiway branches in Perl - the given and when syntax - (2010-09-22)
[2824] A pint of Black Rat, and a lazy barman - (2010-06-25)
[2817] Setting a safety net or fallback value in Perl - (2010-06-19)
[2815] switch and case, or given and when in Perl - (2010-06-17)
[1825] Question Mark - Colon operator (Perl and PHP) - (2008-10-08)
[657] The ternary operator in Python - (2006-03-25)
[299] What - no switch or case statement? - (2005-05-03)
[138] Perl - redo and last without a loop - (2004-12-02)
Some other Articles
Uploading an image, document or pdf via a browser (php)A simple example - XML from a Ruby programHistory is all around usA more informed decision than ever beforeFor loop - checked once, or evety time? Ruby v Perl comparison and contrast__index and __newindex in Lua - metatable methodsOld trackways and routes near MelkshamThe bull on the footpathA walk on the Kennet and AvonError trapping in Lua - no exceptions.