テキストがすでに文字列に含まれている場合、これを行う1つの方法は次のとおりです。
$string =~ s/(.{1000})/$1" & _\n"/sg;
print '"', $string, '"';
または、おそらくより良い:
my @chunks = unpack '(A1000)*', $string;
s/\"/""/g, s/\n/" & vbCrLf & _\n"/g for @chunks; # escape special characters
print '"', join(qq(" & _\n"), @chunks), '"';
ファイルから入力を読み取る場合は、入力レコードの区切り文字を設定することにより、すべての入力をメモリに読み取らずにこれを行うこともできます。
{
local $/ = \1000; # read input in chunks of 1000 chars
print '"';
while ( <> ) {
s/\"/""/g; s/\n/" & vbCrLf & _\n"/g; # escape special characters
print $_, qq(" & _\n");
}
print '"';
}
(これらのメソッドのいくつかは""
、最後の行に無意味なままになることがあります—実際、最後のメソッドは常にそれを行います—しかし、それは問題ではないと思います。)
最後に、これらのメソッドはいずれも、入力に表示される可能性のある特殊文字(二重引用符など)をエスケープするために何も実行しないことに注意してください。入力にそのような文字が含まれている可能性がある場合は、それらを個別に処理する必要があります。必要に応じて、それを行うためのコードを挿入できるポイントをマークしました。
編集:グーグルを実行しましたが、二重引用符で囲まれたVBA文字列でエスケープする必要がある主な文字は、二重引用符(二重引用符で囲む必要があります)と改行(単純なエンコードがなく、 kluge like " & vbCrLf & "
)。このようなエスケープを実装するために、上記のコードを編集しました。さらに確実にしたい場合は、次のようなものを使用して、印刷不可能でASCII以外のすべての文字をエスケープすることもできると思います。
s/([^\n -~])/sprintf '" & Chr(%d) & "', ord $1/eg
(Ps。バックスラッシュは、s/\"/""/g
SOの構文ハイライトを混乱させないようにするためだけにあります。)