文字列に二重引用符が含まれている場合は、 でエスケープする必要があります\
。
$cmd .= "-U $user_name -P $password -S $host -d master -Q \"BACKUP DATABASE [$database_name] TO DISK = N'$path'\" ";
また、Perl では、引用区切り文字に他の文字を使用できます。qq
ほとんどすべての文字が続く場合は、二重引用符と同じです。したがって、バックスラッシュの必要性を避けるために、次のようなことができます。
$cmd .= qq(-U $user_name -P $password -S $host -d master -Q "BACKUP DATABASE [$database_name] TO DISK = N'$path'" );
$cmd .= qq|-U $user_name -P $password -S $host -d master -Q "BACKUP DATABASE [$database_name] TO DISK = N'$path'" |;
等々...
更新: Perl でシステム コマンドを実行する方法。次の 3 つの基本的な方法があります。
system($cmd); #Goes through the shell if shell metacharacters are detected.
system(@command_and_args); #first element is the command, the rest are arguments
system
コマンドを実行し、それが戻るのを待ちます。戻り値は、プログラムの終了ステータスです。
my @results = `$cmd`; #Always goes through shell.
バッククォートはコマンドを実行し、その出力を返します。これは、実際に出力が必要な場合にのみ使用してください。それ以外の場合は、 を使用することをお勧めしsystem
ます。
exec $cmd;
exec @command_and_args;
exec
戻らないことを除いて、system とまったく同じです。別のプログラムを呼び出して、プログラムを効果的に終了します。
状況に最も適したものを使用してください。または、この場合、SQL を実行しているので、DBIモジュールの使用を検討してください。いくつかの単純なコマンドよりも優れたアプローチであることは間違いありません。