директория ввода санитарии - PullRequest
1 голос
/ 12 июля 2010

У меня есть очень простой Perl-скрипт, который перемещает файлы (не спрашивайте, почему я не могу использовать cp, это long, sad и заставит вас плакать).Я беру 2 ввода из командной строки, dir1 и dir2.Затем у меня есть внутренний список файлов, которые я извлекаю и объединяю вместе.

my $file = dir1 . filename

Это прекрасно работает, пока пользователь помещает талинг / в свой каталог.Но очевидно, что если они этого не делают, он все равно объединяет его как / my / awesome / folderFILE, и сценарии не выполняются.

Каков наилучший метод для очистки пользовательских каталогов?

Ответы [ 4 ]

3 голосов
/ 12 июля 2010

Хотя вы можете, как уже упоминалось в других ответах, просто принудительно добавить завершающий слеш, у него есть некоторые незначительные проблемы, возникающие в результате двойного слеша - просто выглядеть некрасиво, по крайней мере, ИМХО, если вы печатаете имена файлов дляпротоколирование;к гораздо худшей проблеме усложнения синтаксического анализа / обработки указанных журналов при необходимости.

Более переносимый и идиоматический подход в Perl - это создание путей с использованием File :: Spec:

use File::Spec;
my $file = File::Spec::catfile($dir1,$filename);

Если вы чувствуете, что использовать модуль для чего-то, ЧТО простое - это не совсем простой подход, используйте регулярное выражение (, чтобы у вас теперь было 2 проблемы !:)

$dir =~ s!([^/])$!$1/!;  

Этот подход обладает дополнительным преимуществом обучающего устройства для демонстрации того, что вам не нужно использовать косую черту в качестве разделителей регулярных выражений.

Кроме того, и, вероятно, уже очевидно для вас, но стоитповторение: НИКОГДА НЕ ДОВЕРЯЙТЕ ВХОДУ ПОЛЬЗОВАТЕЛЯ !!!

Поэтому при обработке параметров командной строки всегда делайте что-то вроде die "Not a directory: $dir1\n" unless -d $dir1;.

0 голосов
/ 13 июля 2010

Вы можете перевести требование «добавить трейлинг / к пути, если у него его еще нет», с английского на Perl, не требует регулярных выражений:

$path .= '/' unless substr($path, -1) eq '/';
0 голосов
/ 12 июля 2010
my $file = $dir1 . '/' . $filename

/a/b//c работает так же, как /a/b/c

0 голосов
/ 12 июля 2010

Просто всегда добавляйте завершающий '/' для пути к каталогу. Ваша оболочка должна принять '/ my / awesome / folder // FILE' и интерпретировать его как '/my/awesome/folder/FILE'.

...