>> text >>> text #### >> text PYTHON_PROMPT text #### foreach (split("==========\n", <<'__EOI__')) >>> i = q ========== YES >>> i = q ========== >>> i = q YES ========== >>> i = q >> ========== >> >>> i = q ========== >>> i = q >> No! ========== >> No! >>> i = q ========== YES >>> i = q YES >>> i = q ========== >>> i = q >> No! YES >>> i = q <--- FAILS!! __EOI__ #### { s/ \G ( # $1 (?: # Substitution prevented by preceeding ">>" >> (?!>) [^\n]* \n >>> [^\n]* \n | (?! >> ) [^\n]* \n )* ) >>> ( # $2 [^\n]* \n ) # Substitution supressed by following ">>". (?! >> (?!>)) /${1}PYTHON_PROMPT${2}/xg; print; print("==========\n"); } #### foreach (split("==========\n", <<'__EOI__')) >>> i = q ========== YES >>> i = q ========== >>> i = q YES ========== >>> i = q >> ========== >> >>> i = q ========== >>> i = q >> No! ========== >> No! >>> i = q ========== YES >>> i = q YES >>> i = q ========== >>> i = q >> No! YES >>> i = q __EOI__ #### { foreach ($_) { if (/\G (?= >>> )/xgc) { # Substitution supressed by following ">>". redo if /\G >>> [^\n]* \n (?= >> (?!>) ) /xcg; # Do substitution. s/\G >>>/PYTHON_PROMPT/xcg; # Go process next line. /\G [^\n]* \n /xcg; redo; } # Substitution prevented by preceeding ">>" /\G >> (?!>) [^\n]* \n >>> [^\n]* \n /xcg && redo; # ^^^^^ optional due to statement order. # Go process next line. m/\G [^\n]* \n /xcg && redo; } print; print("==========\n"); }