Вы можете правильно указывать имена файлов в строке, которую вы передаете системе, как показывает @Borodin в своем ответе. Что-то вроде: system("montage.exe '$pic1' '$pic2'")
Однако более надежным и безопасным решением является передача аргументов в montage.exe в качестве дополнительных параметров в системном вызове:
system('montage.exe', $pic2, $pic2, 'output.png')
Теперь вам не нужно беспокоиться о вложении правильных кавычек или о файлах с неожиданными символами. Это не только более простой код, но и позволяет избежать проблем со злонамеренным внедрением, если эти имена файлов когда-либо поступают из испорченного источника. Кто-то может ввести | rm *
, но ваш системный вызов не удалит все ваши файлы за вас.
Кроме того, в реальной жизни у вас, вероятно, не будет отдельной скалярной переменной для каждого имени файла. Вы будете иметь их в массиве. Это делает ваш системный вызов еще проще:
system('montage.exe', @filenames, 'output.png')
Мало того, что это супер просто, но и позволяет избежать ловушки слишком длинной командной строки. Если ваши имена файлов имеют хорошие длинные пути (возможно, 50-100 символов), командная строка Windows превысит максимальную длину команды после примерно 100 файлов. Передача аргументов через system () вместо одной большой строки устраняет это ограничение.