Perl until Menu:
1. The syntax forms
1.1. General until statement
1.1.1. until and an infinite loop
1.1.2. until and the diamond operator <>
1.1.3. until in connection with next, last, redo and continue
1.1.4. until and arrays
1.1.5. until and hashes (associative arrays)
1.2. until used as a modifier
The Perl until looping statement is the opposite of the while loop, i.e. it executes repeatedly a block of code until a test condition becomes true, or in other words it executes the block of code as long as the test condition remains false. The while statement evaluates a control expression and executes the body as long as the control expression remains true. It’s important to highlight that both looping statements – while and until – will evaluate the test condition before to execute the statement body, so if the condition is initially false (for the while statement) or true (for the until statement), the block of the statement will be skipped entirely.
The syntax forms of the two statements are almost identically, you can replace while with until and you have the syntax forms of the until statement – of course they differ in function of the test condition result (true or false). So I heartily recommend to check out my while link first and after that revisit this page.
You can also use the last, next and redo looping controls in order to change the usual behavior of the Perl until loop iteration. These three controls allow you to control the flow of execution in the until block.
In the same time you can attach a continue block to the Perl until statement if you need to execute some piece of code after the current iteration.
Check my new How To Tutorial eBooks (PDF format):to see a lot of fully commented examples that help you use the Perl statements and the Perl buit-in functions in your scripts.
Now it’s the time to have a look at the syntax forms of the Perl until statement:
LABEL until (EXPR) BLOCK continue BLOCK
Either the LABEL or the continue BLOCK are optional. EXPR is a conditional expression that will be evaluated before the current iteration of the loop.You’ll find below a few ways to use the Perl until statement.
The next example will show you an infinite loop and how to end it by using the last looping control:$count = -100;
until(0) {
last if $count >= 100;
$count++;
}
print "count = $count\n";
# it displays count = 100;
You can use the until statement with the diamond operator <>, as in the following snippet code:until ($line = <STDIN>) {
print "I am inside the main block\n";
}
continue {
print "I am inside the continue block\n";
}
chomp $line;
print "I typed: $line\n";
This code will read from the standard input one line of text, and because the test condition will be evaluated true, neither the body of the until statement nor the continue block will be executed; the script program will continue with the statements that follows the until statement. If we assume that we run this code and type "First line" followed by the return key from the keyboard, the output of the program will be:First line
I typed: First line
This is an example when initially the test condition is evaluated true and therefore the Perl until statement was skipped entirely. It was only a demonstrative example, if you want to use the diamond operator in connection with a loop statement, the while statement is more appropriate. Well, is not entirely true what I said before, the next snippet code shows you another way to use until in connection with the <> diamond operator:
until($exit =~ /yes/i ) {
print "Exit the loop? (yes/no): ";
chomp($exit = <STDIN>);
}
And a sample of output:Do you exit the loop? (yes/no): No, I don't
Do you exit the loop? (yes/no): Yes, I do
Check my new How To Tutorial eBooks (PDF format):to see a lot of fully commented examples that help you use the Perl statements and the Perl buit-in functions in your scripts.
The next example will show you how to use the until statement in connection with the looping controls and continue block. See the code:$count = 10;
until($count <= 0) {
last if $count < 3;
next if $count%2 == 0;
$count--, redo if $count == 7;
print "$count ";
}
continue {
$count--;
}
print "\n";
# it displays 9 5 3
The above code will print the odd numbers less than 10 and greater or equal to 3, excepting the number 7 (the redo control will reiterate the loop but neither executing the continue block nor testing the conditional expression, so I must to decrement the $count before to execute the redo control in order to avoid an infinite loop). Note the using of the remainder operator and the next looping control that allowed me to skip the even numbers.
The next control, before to reiterate the loop and test the conditional expression, will execute the statements from within the continue block.
The last control will jump out of the main block without executing the continue block.
The next example will remove one by one the elements of an array:# initialize an array
$count = 0;
@numbers = qw(one two three four five);
until(!@numbers) {
$count++;
shift(@numbers);
}
print "$count elements were deleted!\n";
# it displays: 5 elements were deleted!
I remember you that the shift() function removes the first element of an array. You can use within the until block some other array functions:- unshift – insert an element at the beginning of an array
- push - adds an element at the end of an array
- pop – removes the last element of an array
but keep in mind that the Perl until loop from the above example will end only when the @numbers array will become empty, otherwise the loop will continue to iterate infinitely.
The following example is a bit similar with the previous one; after iterating 100 times the until block, it will empty the hash structure and the loop will be finished.$count = 100;
# initialize a hash
%numbers = (1 => "one", 2 => "two",
3 => "three", 4 => "four",
5 => five);
until(!%numbers) {
$count--;
%numbers = () if $count == 0;
}
print "count = $count\n";
# it displays: count = 0
This is a short form and uses Perl until statement as a modifier of a statement. Take a look at the next sample code:$count = 10;
print $count, " " until --$count <=0;
print "\n";
# it displays: 9 8 7 6 5 4 3 2 1
print "count = $count\n" # displays count = 0
Some remarks about the second line of this code. First, the $count scalar variable will be decremented and next it will be evaluated the test condition (i.e. to check up if $count is less than or equal to 0). If the conditional expression is false, the $count variable will be printed and the loop iteration will continue; otherwise the loop will be finished and Perl will execute the third line of this snippet code.