В случае, если следует избегать цикла и нет других (простых) методов, может быть полезно определить элементарную функцию подстроки и применить ее к массиву строк. Например,
module str_mod
implicit none
contains
elemental function substr( s, a, b ) result( res )
character(*), intent(in) :: s
integer, intent(in) :: a, b
character(len(s)) :: res
res = s( a : b )
endfunction
endmodule
program main
use str_mod
implicit none
character(10) :: s( 5 )
integer, allocatable :: ind(:)
character(len(s)), allocatable :: comp(:)
s = [ '1_E ', '2_S ', '3_E ', '14_E', '25_S' ]
! s = [ character(len(s)) :: '1_E', '2_S', '3_E', '14_E', '25_S' ]
print *, "test(scalar) : ", substr( s(1), 1, 2 )
print *, "test(array ) : ", substr( s, 1, 2 )
ind = index( s, '_' )
comp = substr( s, 1, ind-1 )
print *
print *, "string (all) : ", s
print *, "string before _ : ", comp
print *, "string after _ : ", substr( s, ind+1, len(s) )
endprogram
который дает (с гфортраном-7,3)
test(scalar) : 1_
test(array ) : 1_ 2_ 3_ 14 25
string (all) : 1_E 2_S 3_E 14_E 25_S
string before _ : 1 2 3 14 25
string after _ : E S E E S