Оператор 'open' в Perl разбивает путь с пробелами - как прочитать файл с пробелами в пути? - PullRequest
0 голосов
/ 07 марта 2011

Я бился головой об ту же стену в течение 48 часов.Как передать аргумент командной строки в Perl, чтобы, когда у Perl была возможность открыть файл, он правильно обрабатывал пространства в стиле Windows, которые встречаются в каталогах a) или b) имен файлов:

# open( PRELIM, "\"$ifile\"") or die "Cannot open $ifile";
# open( PRELIM, '\"$ifile\"') or die "Cannot open $ifile";
## Both these lines cannot deal with a space present in the path:
# open PRELIM, $ifile or print "\n* Couldn't open ${ifile}\n\n" && return;
# $ifile = qq($ifile);  Doesn't help, still leaves the file as if it was 'two' files
#
  # Quotes around $ifile do no good either
open( PRELIM, $ifile) or die "Cannot open $ifile"

Как правило, приведенная выше строка верна до тех пор, пока в переменной '$ ifile' не будет пробела.

Ответы [ 4 ]

4 голосов
/ 08 марта 2011

Чтобы передать аргумент командной строки как один аргумент, который также содержит пробелы, заключите его в кавычки. Например:

perl script-name.pl "C: \ Мой путь с пробелами"

Это приведет к тому, что параметр будет обрабатываться как одно слово.

(В вашем коде, если вы жестко программируете обратную косую черту, вам нужно удвоить их, так как "\" - это специальный метасимвол, поэтому "\" будет преобразован в "\" при компиляции -время.)

2 голосов
/ 09 марта 2011

Требуется форма с тремя аргументами open():

open(PRELIM, '<', $ifile) or die "Cannot open $ifile"    # For reading
open(PRELIM, '>', $ifile) or die "Cannot open $ifile"    # For writing

Всегда используйте версию аргумента open() с тремя аргументами, чтобы избежать подобных проблем.

1 голос
/ 08 августа 2011

Убедитесь, что вы также не используете зарезервированные символы в вашем имени файла.

Я допустил эту ошибку, используя знак вопроса в качестве значения поля по умолчанию, которое материализовалось только в имени файла как проблема!

1 голос
/ 07 марта 2011

Я не слишком знаком с Perl, но я смог осмотреться и нашел сообщение на форуме, которое может вам помочь: http://www.tek -tips.com / viewthread.cfm? Qid = 376686 & page = 567

Они обсуждают точную проблему, с которой вы столкнулись, и первый из них предложил использовать одинарные кавычки вместо двойных для использования строкового литерала, поэтому $ DIRECTORY = 'C: \ Documents and Settings';

вместо

$DIRECTORY = "C:\Documents and Settings";

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...