perl -le 'print $1 while ($ARGV[0] =~ s/(.{1,2})(.*)/$2/g);' "123456789" perl -le '$c=-2; print while $_ = substr $ARGV[0], $c+=2, 2;' "123456789" # or perl -le 'while ($_ = substr $ARGV[0], $c, 2) { print; $c+=2 };' "123456789" perl -le '@_=reverse split//, $ARGV[0]; while (@_) {print join"", (pop@_, pop@_);}' "123456789" perl -le '@_=split//, $ARGV[0]; while (@_) {print join"", (shift@_, shift@_);}' "123456789" perl -le '@_=split//, $ARGV[0]; while (@_) {print join "", splice @_, 0, 2}' "123456789" perl -le '@_ = split //,$ARGV[0]; splice @_, $_, 2, $_[$_].$_[$_+1] for 0..$#_/2; print "@_"' "123456789" # some alternatives to ones already posted.. perl -le 'print for grep /./, split /(..)/, $ARGV[0]' "123456789" perl -le 'print for unpack "(Z2)*", $ARGV[0]' "123456789" # probably the fastest echo 123456789 | perl -nle 'print for /(..?)/g'