Perl fileparse Path Name
Вот моя ситуация:
use strict;
use Cwd;
use Getopt::Long;
Getopt::Long::Configure('pass_through');
use File::Spec;
use File::Basename;
1) -out=/some/place/some_filename.txt
2) -out=/some/place/
3) -out=some_filename.txt
Любой пользователь может дать любой '-out=', как указано выше. Меня интересует путь, потому что я должен проверить, доступен ли для записи каталог, чтобы создать / перезаписать файл журнала, и выйти с предупреждением, если каталог не доступен для записи.
Если -out = вариант 1, то fileparse выдаст мне '/ some / place', и я могу -w на этом.
Если -out = это вариант 2, тогда я могу просто -d и -w, а затем прикрепить имя файла по умолчанию. Что-то вроде '/some/place/default_filename.txt'
Если -out = вариант 3, я должен присоединить "мой $cwd" к имени файла. Что-то вроде '/current/working/dir/some_filename.txt'
Запрашиваемый файл может существовать или не существовать. Имя файла может быть.log или.txt или.dat или вообще без расширения, в зависимости от прихоти пользователя, и я должен создать / перезаписать этот файл по мере необходимости.
Так что мой вопрос к более опытным тактикам Perl здесь, так как -out = будет неопределенным от пользователя к пользователю, каков наилучший метод для извлечения пути? Я могу сделать 'if (-d $out)', но что если пользователь только что дал имя файла? Мне может повезти, и пользователь может указать полный путь / имя файла или просто путь к каталогу. Или пользователь может быть удовлетворен наличием его данных в текущем рабочем каталоге и будет давать только имя файла. Я вставил имя файла в fileparse и получил: "$path=./"
Родерик
1 ответ
Вы можете просто проверить, является ли ваш параметр каталогом (-d $out
) и добавьте имя файла по умолчанию в этом случае. Тогда все, что вам нужно, чтобы проверить, доступен ли результирующий файл для записи, и выручить, если это не так:
$out .= "/default_filename.txt" if -d $out;
die "File $out is not writable!" unless -w $out;
# everything ok, create file at $out:
open FILE, ">", $out or die "Cannot open $out for writing!";
# ...