Para cada linha, você pode usar apenas substr($line,30,2)
para obter os dois caracteres desejados. Então, algo parecido com
#!/usr/bin/perl
use warnings;
use strict;
open(my $file1,">file1");
open(my $file2,">file2");
open(my $file3,">file3");
while(<>)
{
my $ch=substr($_,30,2);
if ($ch eq '0A') { print $file1 $_; }
elsif ($ch eq '0B') { print $file2 $_; }
elsif ($ch eq '0C') { print $file3 $_; }
else { print "Bad line skipped: $_"; }
}
Podemos ver isso em ação:
$ cat input
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110C11111111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110B111111111111111111
$ ./script input
$ cat file1
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
1111111111111111111111111111110A111111111111111111111111111111
$ cat file2
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110B111111111111111111
1111111111111111111111111111110B111111111111111111
$ cat file3
1111111111111111111111111111110C11111111111111111111111