Как сделать файловые операции Perl независимыми от платформы?

#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 > является a glob по причинам, которые, вероятно, не стоит понимать. Лучше использовать 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 ), но многие требуют, чтобы он был заключен в кавычки, чтобы избежать двусмысленности с параметрами.