Well, if you don't count
$_ as an extra variable because it's already implicitly there, you can do it like this:
use bytes;
if (vec($s,3,2) < 3) {
vec($s,$_,8) = vec($s,$_+1,8) for 0..length($s)-2;
chop($s);
}
else {
vec($s,$_,8) = vec($s,$_+1,8) for 0..length($s)-2;
chop($s);
while (vec($s,3,2) == 2) {
vec($s,$_,8) = vec($s,$_+1,8) for 0..length($s)-2;
chop($s);
}
}
Update:
Hmm, here's a solution without $_:
use bytes;
if (vec($s,3,2) < 3) {
() = $s =~ m/.(?=.)(?{ vec($s,pos($s)-1,8) = vec($s,pos($s),8)
+})/sg;
chop($s);
}
else {
() = $s =~ m/.(?=.)(?{ vec($s,pos($s)-1,8) = vec($s,pos($s),8)
+})/sg;
chop($s);
while (vec($s,3,2) == 2) {
() = $s =~ m/.(?=.)(?{ vec($s,pos($s)-1,8) = vec($s,pos($s
+),8)})/sg;
chop($s);
}
}