I do not understand your overall question.
However, some specific comments on the OPed regexes:
-
Inside and at the very beginning of a character class, the ^ regex metacharacter produces class "inversion", i.e., the class matches any character not in the class. So [^$find1] is the same as [^%] and matches any character that is not a '%' character.
-
Outside a character class, the ^ metacharacter asserts the beginning of the string (if the /m regex modifier is not used). So [^$find1]?^ is the same as [^%]?^ and matches zero or one of any character that is not a '%' and that is before the beginning of the string. Effectively, it matches the beginning of the string and a '^' character is always inserted at the beginning of the string by the substitution.
-
The expression [$find1]?$ matches zero or one '%' characters at the end of the string (or before a newline at the end of the string). Effectively, a '+' character is always inserted at the end of the string by the substitution.
Update:
c:\@Work\Perl\monks>perl -wMstrict -le
"my $field2_b = 'abcd';
;;
my $find1 = '%';
if ($field2_b ne '') { s/[^$find1]?^/\^/, s/[$find1]?$/+/ for $field2
+_b };
print qq{'$field2_b'};
"
'^abcd+'
Please see
perlre,
perlrecharclass,
perlrequick, and especially
perlretut.
Give a man a fish: <%-(-(-(-<