Код был изменен, чтобы отразить изменение в вопросе.
Этот код разбивает входные данные на сегменты с разделителями, копируя каждый сегмент непосредственно в выходные данные, используя модификацию ссылок. Если текст для удаления отсутствует (без разделителя), он скопирует весь ввод непосредственно в вывод.
Этот метод влияет на производительность. В частности, перемещение каждого сегмента приведет к заполнению пространства на выходе. Чем больше количество сегментов, тем хуже производительность.
Я изменил WA-OUTPUT
на X(2000)
, поскольку выход никогда не может быть больше, чем вход.
01 TINP.
05 TINPFIELD PIC X(2000) VALUE
'{4:72:SELLS¬#:73:ABC¬#:PPF:TESTPPF¬#:74:BLA' &
'¬#:PPF:TESTPPF¬#:74:BLA¬#-}'.
01 WA-OUTPUT PIC X(2000) value spaces.
01 segment-length binary pic 9(4).
01 additional-characters binary pic 9(4).
01 input-pointer binary pic 9(4).
01 output-pointer binary pic 9(4).
01 input-length binary pic 9(4).
01 output-length binary pic 9(4).
procedure division.
begin.
move 1 to input-pointer output-pointer
input-length output-length
inspect TINPFIELD tallying
input-length for characters before "}".
display input-length
display TINPFIELD
perform until input-pointer > function length(TINPFIELD)
unstring TINPFIELD delimited "¬#:PPF:"
into WA-OUTPUT (output-pointer:)
count in segment-length
with pointer input-pointer
add segment-length to output-pointer
if input-pointer <= function length(TINPFIELD)
move 0 to additional-characters
inspect TINPFIELD (input-pointer:) tallying
additional-characters for characters before "¬"
add additional-characters to input-pointer
end-if
end-perform
inspect WA-OUTPUT tallying
output-length for characters before "}".
display wa-output
display output-length
goback
.
Выход:
0070
{4:72:SELLS¬#:73:ABC¬#:PPF:TESTPPF¬#:74:BLA¬#:PPF:TESTPPF¬#:74:BLA¬#-}
{4:72:SELLS¬#:73:ABC¬#:74:BLA¬#:74:BLA¬#-}
0042
Это - модификация вышеупомянутого, которая, хотя и немного более сложная, устраняет снижение производительности при заполнении пространства, когда имеется большее количество сегментов. Это необычно, потому что, хотя оно использует оператор UNSTRING
, оно на самом деле ничего не «натягивает».
01 TINP.
05 TINPFIELD PIC X(2000) VALUE
'{4:72:SELLS¬#:73:ABC¬#:PPF:TESTPPF¬#:74:BLA' &
'¬#:PPF:TESTPPF¬#:74:BLA¬#-}'.
01 WA-OUTPUT PIC X(2000) value spaces.
01 segment-length binary pic 9(4).
01 segment-holder pic x.
01 additional-characters binary pic 9(4).
01 input-pointer binary pic 9(4).
01 backup-pointer binary pic 9(4).
01 output-pointer binary pic 9(4).
01 input-length binary pic 9(4).
01 output-length binary pic 9(4).
procedure division.
begin.
move 1 to input-pointer output-pointer
input-length output-length
inspect TINPFIELD tallying
input-length for characters before "}".
display input-length
display TINPFIELD
perform until input-pointer > function length(TINPFIELD)
move input-pointer to backup-pointer
unstring TINPFIELD delimited "¬#:PPF:"
into segment-holder
count in segment-length
with pointer input-pointer
move TINPFIELD (backup-pointer:segment-length)
to WA-OUTPUT (output-pointer:segment-length)
add segment-length to output-pointer
if input-pointer <= function length(TINPFIELD)
move 0 to additional-characters
inspect TINPFIELD (input-pointer:) tallying
additional-characters for characters before "¬"
add additional-characters to input-pointer
end-if
end-perform
if output-pointer < function length (WA-OUTPUT)
move space to WA-OUTPUT (output-pointer:)
inspect WA-OUTPUT tallying
output-length for characters before "}".
display wa-output
display output-length
goback
.
Вывод такой же.