#perl
#perl
Вопрос:
Я использую Perl в Linux, но я начал использовать File::Spec->catfile
, чтобы мой код perl запускался и в Windows, например,
$tmp = File::Spec->catfile($ENV{HOME}, "tmp");
вместо
$tmp = "$ENV{HOME}/tmp";
Но как я могу сделать следующий код переносимым:
my @files = <$ENV{HOME}/tmp/*>;
Он использует косые черты в качестве разделителей файлов, поэтому я предполагаю, что он не будет работать в Windows. И я не понимаю, как использовать File::Spec->catfile
в этом выражении?
Комментарии:
1. Perl распознает косые
/
черты как разделители файлов даже в Windows.2. @TLP: на самом деле Windows сама распознает
/
разделитель. Но$ENV{HOME}
вряд ли он будет установлен в системе Windows.3. Прохладный.
catfile
Тогда для чего вообще использовать? Существуют ли другие системы, на которых/
это не работает?4. @TLP, Perl просто передает пути к системе. За пределами таких модулей, как File::Spec и File::Basename, он не знает и не заботится о том, что «/» является разделителем файлов.
5. @ikegami: И, может быть, какая-нибудь будущая система, на которую в конечном итоге будет перенесен ваш код.
Ответ №1:
Поскольку catfile
просто возвращает строку, которую можно использовать в качестве имени файла, вы можете сделать что-то вроде этого (непроверенный):
$tmp = File::Spec->catfile($ENV{HOME}, "tmp", "*");
my @files = glob $tmp;
Но $ENV{HOME}
вряд ли он будет установлен в системе Windows.
Вы можете рассмотреть возможность использования File::Spec->tmpdir()
.
Комментарии:
1. О, хороший вопрос! Оказывается, что
<$tmp>
вызываетreadline
, но<$tmp >
является aglob
по причинам, которые, вероятно, не стоит понимать. Лучше использоватьglob
функцию явно; Я обновлю свой ответ.2.
bsd_glob
На самом деле лучше использовать напрямую, а не черезglob
.3. @ikegami: Вы имеете
File::Glob::bsd_glob
в виду, а не встроеннуюglob
функцию? Я не знал об этом. Могут ли причины, по которым это лучше, быть указаны (или связаны) достаточно кратко для комментария? Я склонен думать, что использование встроенного чище, если нет какого-то конкретного преимущества.4. @Keith Thompson, да, это одна и та же функция. В зависимости от того, как вы его вызываете (через
glob
или нет), он обрабатывает пробелы по-разному.glob
действительно неправильно обрабатывает пробелы в зависимости от того, как должны использовать людиglob
. Работа по назначению является основным конкретным преимуществом 🙂
Ответ №2:
glob
Функция может быть использована:
my @files = glob File::Spec->catfile( $ENV{'HOME'}, 'tmp', '*' );
Как указывалось в других комментариях, Perl работает с /
Windows. Однако, чтобы сделать его более переносимым, я рассмотрю вышеупомянутое использование.
Комментарии:
1. Это не Perl, который работает с косыми чертами, это сама ОС Windows, которая отлично работает с косыми чертами (только оболочка Windows требует обратных косых черт)
2. @tadmc, многие команды оболочки также принимают «/» (
dir
,cd
), но многие требуют, чтобы он был заключен в кавычки, чтобы избежать двусмысленности с параметрами.