unless expression: when condition is false execute the block.
 
unless($fred=~/^[A-Z_]\w*$/i){
 print "The value of \$fred doesn't look like a perl identifier name.\n";
}
 
It's the same as written like this:
 
if($fred=~/^[A-Z_]\w*$/i){
 # do nothing
}else{
 print "The value of \$fred doesn't look like a perl identifier name.\n";
}
 
Or:
 
if(!($fred=~/^[A-Z_]\w*$/i)){
 print "The value of \$fred doesn't look like a perl identifier name.\n";
}
 
until expression: when condition is false execute the loop.
 
until($j>$i){
 $j *= 2;
}
 
if expression can be written without a block of {}
 
print "$n is a negative number.\n" if $n < 0;
 
Perl execute 'if $n < 0' first, if it's true then execute the print expression, if false do nothing.
 
Those styles are all popular in Perl:
 
&error("Invalid input") unless &valid($input);
$i *=2 until $i > $j;
print " ", ($n += 2) while $n < 10;
&greet($_) foreach @person;
 
If there are more than one expression, better to write them in {} blocks.
 
elsif expression:
 
if(condition){
 do something;
}elsif(condition){
 do something;
}elsif(condition){
 do something;
}else{
 do something;
}
 
my $bedrock=42;
$bedrock++;
 
my @people=qw{ Fred barney Fred wilma dino barney Fred pebbles };
my %count;
$count{$_}++ foreach @people;
 
++ means +1 byself, undef++ gets 1
 
my $n=++$m;
$m add 1, then give value to $n.
 
my $n=$m++;
give value to $n, then $m add 1.
 
for (init;test;increment){
 body;
 body;
}
 
for(i=1;$i<=10;$i++){
 print "I can count to $i!\n";
}
 
Any of init, test, increment can be empty, but the symbol ';' should be there.
 
for($_="bedrock";s/(.)//;){ # whenever s/// successes, loop continue
 print "One character is: $1\n";
}
 
for(1..10){
 print "I can count to $_!\n":
}
 
Here 'for' is the same as foreach. for and foreach are the same in Perl, Perl will judge by the contents in (). If there're ';' in () then it's for, otherwise it's foreach.