s/./ do_smth( $& ) /eg;
m/.(?{ do_smth( $& ); })(*FAIL)/;
do_smth( $& ) while m/./g;
####
#!/usr/bin/perl
use strict;
use warnings;
print "# The need of clear borders of the elements:\n";
print "## Without borders (wrong):\n";
"1 23 456" =~ m/\d+(?{ print "[$&]" })(*FAIL)/;
print "\n";
print "## With borders (correct):\n";
"1 23 456" =~ m/\b\d+\b(?{ print "[$&]" })(*FAIL)/;
print "\n";
print "## Alternative (correct):\n";
"1 23 456" =~ m/\d+(*SKIP)(?{ print "[$&]" })(*FAIL)/;
print "\n";
my @A = ( 1 .. 3, 'abc', 'zz', 79, 444 );
my $A = join ',', @A; # ',' -- one reserved character;
m/[,]/ and die "Elem '$_' of \@A contains separator '$&'!\n" for @A;
print "# SIMPLE LOOPING through an array:\n";
print "## NON-DESTRUCTIVE:\n";
for( my $i = 0; $i < @A; $i ++ ){
print "[$A[ $i ]]";
}
print "\n";
for my $A ( @A ){
print "[$A]";
}
print "\n";
$A =~ m/
\b([^,]+)\b
(?{ print "[$1]" })
(*FAIL)
/x;
print "\n";
print "## DESTRUCTIVE:\n";
for( my $i = 0; $i < @A; $i ++ ){
$A[ $i ] .= 'X';
print "[$A[ $i ]]";
}
print "\n";
chop for @A;
for my $A ( @A ){
$A .= 'X';
print "[$A]";
}
print "\n";
chop for @A;
$A =~ s/
\b([^,]+)\b
/ $1 . 'X' /gex;
print $A =~ s/\b([^,]+)\b,?/[$1]/gr;
print "\n";
$A =~ s/X//g;
print "# LOOPING through an array by evaluating several (2-3) consecutive elements:\n";
print "## NON-DESTRUCTIVE:\n";
for( my $i = 0; $i < @A - 1; $i ++ ){
print "[$A[ $i ]-$A[ $i + 1 ]]";
}
print "\n";
for my $i ( 0 .. @A - 2 ){
print "[$A[ $i ]-$A[ $i + 1 ]]";
}
print "\n";
$A =~ m/
\b([^,]+)\b,
\b([^,]+)\b
(?{ print "[$1-$2]" })
(*FAIL)
/x;
print "\n";
# ----
for( my $i = 0; $i < @A - 1; $i += 2 ){
print "[$A[ $i ]-$A[ $i + 1 ]]";
}
print "\n";
for my $i ( grep $_ % 2 == 0, 0 .. @A - 2 ){
print "[$A[ $i ]-$A[ $i + 1 ]]";
}
print "\n";
$A =~ m/
\b([^,]+)\b,(*SKIP)
\b([^,]+)\b
(?{ print "[$1-$2]" })
(*FAIL)
/x;
print "\n";
# ----
for( my $i = 0; $i < @A - 2; $i ++ ){
print "[$A[ $i ]-$A[ $i + 1 ]-$A[ $i + 2 ]]";
}
print "\n";
for my $i ( 0 .. @A - 3 ){
print "[$A[ $i ]-$A[ $i + 1 ]-$A[ $i + 2 ]]";
}
print "\n";
$A =~ m/
\b([^,]+)\b,
\b([^,]+)\b,
\b([^,]+)\b
(?{ print "[$1-$2-$3]" })
(*FAIL)
/x;
print "\n";
# ----
for( my $i = 0; $i < @A - 2; $i += 2 ){
print "[$A[ $i ]-$A[ $i + 1 ]-$A[ $i + 2 ]]";
}
print "\n";
for my $i ( grep $_ % 2 == 0, 0 .. @A - 3 ){
print "[$A[ $i ]-$A[ $i + 1 ]-$A[ $i + 2 ]]";
}
print "\n";
$A =~ m/
\b([^,]+)\b,(*SKIP)
\b([^,]+)\b,
\b([^,]+)\b
(?{ print "[$1-$2-$3]" })
(*FAIL)
/x;
print "\n";
# ----
for( my $i = 0; $i < @A - 2; $i += 3 ){
print "[$A[ $i ]-$A[ $i + 1 ]-$A[ $i + 2 ]]";
}
print "\n";
for my $i ( grep $_ % 3 == 0, 0 .. @A - 3 ){
print "[$A[ $i ]-$A[ $i + 1 ]-$A[ $i + 2 ]]";
}
print "\n";
$A =~ m/
\b([^,]+)\b,
\b([^,]+)\b,(*SKIP)
\b([^,]+)\b
(?{ print "[$1-$2-$3]" })
(*FAIL)
/x;
print "\n";
print "## DESTRUCTIVE:\n";
# ----
for( my $i = 0; $i < @A - 2; $i ++ ){
$A[ $i ] .= $A[ $i + 1 ] gt $A[ $i + 2 ] ? 'X' : 'Y';
print "[$A[ $i ]-$A[ $i + 1 ]-$A[ $i + 2 ]]";
}
print "\n";
s/[XY]// for @A;
for my $i ( 0 .. @A - 3 ){
$A[ $i ] .= $A[ $i + 1 ] gt $A[ $i + 2 ] ? 'X' : 'Y';
print "[$A[ $i ]-$A[ $i + 1 ]-$A[ $i + 2 ]]";
}
print "\n";
s/[XY]// for @A;
$A =~ s/
\b([^,]+)\b
(?=
,\b([^,]+)\b
,\b([^,]+)\b
)
/ my $new = $1 . ( $2 gt $3 ? 'X' : 'Y' ); print "[$new-$2-$3]"; $new /gex;
print "\n";
$A =~ s/[XY]//g;
print "# 'TRIANGLE' LOOPING through an array (loop in loop):\n";
for my $i ( 0 .. @A - 2 ){
for my $j ( $i + 1 .. @A - 1 ){
printf "%10s", " [$A[ $i ]-$A[ $j ]]";
}
print "\n";
}
$A =~ m/
\b([^,]+)\b
.*?
\b([^,]+)\b
(?{ printf "%10s", " [$1-$2]" })
(?=$)
(?{ print "\n" })
(*FAIL)
/x;
print "# 'RECTANGLE' LOOPING through two arrays (loop in loop):\n";
my @B = @A[ 2 .. 4 ];
my $AB = $A . ';' . join ',', @B; # ',' and ';' -- two reserved characters;
m/[,;]/ and die "Elem '$_' of set { \@A, \@B } contains separator '$&'!\n" for @A, @B;
for my $i ( 0 .. @A - 1 ){
for my $j ( 0 .. @B - 1 ){
printf "%10s", " [$A[ $i ]-$B[ $j ]]";
}
print "\n";
}
$AB =~ m/
\b([^,]+)\b
.*;
.*?
\b([^,]+)\b
(?{ printf "%10s", " [$1-$2]" })
(?=$)
(?{ print "\n" })
(*FAIL)
/x;
####
# The need of clear borders of the elements:
## Without borders (wrong):
[1][23][2][3][456][45][4][56][5][6]
## With borders (correct):
[1][23][456]
## Alternative (correct):
[1][23][456]
# SIMPLE LOOPING through an array:
## NON-DESTRUCTIVE:
[1][2][3][abc][zz][79][444]
[1][2][3][abc][zz][79][444]
[1][2][3][abc][zz][79][444]
## DESTRUCTIVE:
[1X][2X][3X][abcX][zzX][79X][444X]
[1X][2X][3X][abcX][zzX][79X][444X]
[1X][2X][3X][abcX][zzX][79X][444X]
# LOOPING through an array by evaluating several (2-3) consecutive elements:
## NON-DESTRUCTIVE:
[1-2][2-3][3-abc][abc-zz][zz-79][79-444]
[1-2][2-3][3-abc][abc-zz][zz-79][79-444]
[1-2][2-3][3-abc][abc-zz][zz-79][79-444]
[1-2][3-abc][zz-79]
[1-2][3-abc][zz-79]
[1-2][3-abc][zz-79]
[1-2-3][2-3-abc][3-abc-zz][abc-zz-79][zz-79-444]
[1-2-3][2-3-abc][3-abc-zz][abc-zz-79][zz-79-444]
[1-2-3][2-3-abc][3-abc-zz][abc-zz-79][zz-79-444]
[1-2-3][3-abc-zz][zz-79-444]
[1-2-3][3-abc-zz][zz-79-444]
[1-2-3][3-abc-zz][zz-79-444]
[1-2-3][abc-zz-79]
[1-2-3][abc-zz-79]
[1-2-3][abc-zz-79]
## DESTRUCTIVE:
[1Y-2-3][2Y-3-abc][3Y-abc-zz][abcX-zz-79][zzX-79-444]
[1Y-2-3][2Y-3-abc][3Y-abc-zz][abcX-zz-79][zzX-79-444]
[1Y-2-3][2Y-3-abc][3Y-abc-zz][abcX-zz-79][zzX-79-444]
# 'TRIANGLE' LOOPING through an array (loop in loop):
[1-2] [1-3] [1-abc] [1-zz] [1-79] [1-444]
[2-3] [2-abc] [2-zz] [2-79] [2-444]
[3-abc] [3-zz] [3-79] [3-444]
[abc-zz] [abc-79] [abc-444]
[zz-79] [zz-444]
[79-444]
[1-2] [1-3] [1-abc] [1-zz] [1-79] [1-444]
[2-3] [2-abc] [2-zz] [2-79] [2-444]
[3-abc] [3-zz] [3-79] [3-444]
[abc-zz] [abc-79] [abc-444]
[zz-79] [zz-444]
[79-444]
# 'RECTANGLE' LOOPING through two arrays (loop in loop):
[1-3] [1-abc] [1-zz]
[2-3] [2-abc] [2-zz]
[3-3] [3-abc] [3-zz]
[abc-3] [abc-abc] [abc-zz]
[zz-3] [zz-abc] [zz-zz]
[79-3] [79-abc] [79-zz]
[444-3] [444-abc] [444-zz]
[1-3] [1-abc] [1-zz]
[2-3] [2-abc] [2-zz]
[3-3] [3-abc] [3-zz]
[abc-3] [abc-abc] [abc-zz]
[zz-3] [zz-abc] [zz-zz]
[79-3] [79-abc] [79-zz]
[444-3] [444-abc] [444-zz]
####
#!/usr/bin/perl
use strict;
use warnings;
my @A = ( 1 .. 3, 'abc', 'zz', 79, 444 );
my $A = join ',', @A;
print "# With 'undef's:\n";
for my( $i, $j, $k )( @A ){
print "[$i-$j-$k]";
}
print "\n";
for( my $i = 0; $i < @A; $i += 3 ){
print "[$A[ $i ]-$A[ $i + 1 ]-$A[ $i + 2 ]]";
}
print "\n";
print "Without 'undef's -- no stepping out of an array:\n";
for my $i ( grep $_ % 3 == 0, 0 .. @A - 3 ){
print "[$A[ $i ]-$A[ $i + 1 ]-$A[ $i + 2 ]]";
}
print "\n";
$A =~ m/
\b([^,]+)\b,
\b([^,]+)\b,(*SKIP)
\b([^,]+)\b
(?{ print "[$1-$2-$3]" })
(*FAIL)
/x;
print "\n";
####
for my (...) is experimental at <...>
# With 'undef's:
Use of uninitialized value <...>
Use of uninitialized value <...>
[1-2-3][abc-zz-79][444--]
Use of uninitialized value <...>
Use of uninitialized value <...>
[1-2-3][abc-zz-79][444--]
Without 'undef's -- no stepping out of an array:
[1-2-3][abc-zz-79]
[1-2-3][abc-zz-79]