Как вывести список файлов с заданным расширением в OCaml - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу получить список прямых файлов (т. Е. Без рекурсивного поиска) данного каталога и данного расширения в OCaml.

Я пробовал следующее, но:

  1. Это ужасно чертовски
  2. Не работает (ошибка импорта)
let list_osc2 = 
  let list_files = Sys.readdir "tests/osc2/expected/pp" in
  List.filter (fun x -> Str.last_chars x 4 = ".osc2") (Array.to_list list_files)

Я получил ошибку (я использую OCamlPro):

Required module `Str' is unavailable

Спасибо

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вы можете использовать Filename.extension вместо Str.last_chars:

let list_osc2 = 
  let list_files = Sys.readdir "tests/osc2/expected/pp" in
  List.filter (fun x -> Filename.extension x = ".osc2") (Array.to_list list_files)

, а затем использовать оператор канала, чтобы сделать его более читабельным:

let list_osc2 = 
  Sys.readdir "tests/osc2/expected/pp"
  |> Array.to_list
  |> List.filter (fun x -> Filename.extension x = "osc2")

Я не Я не знаю, как вы ожидаете, что это будет работать в OCamlPro, поскольку, насколько я знаю, у него нет файловой системы.

1 голос
/ 15 апреля 2020

Чтобы использовать модуль Str, необходимо установить связь с библиотекой str . Например, с ocamlc вам нужно передать str.cma, а с ocamlopt вам нужно пройти str.cmxa. Я не знаю, как это сделать с OcamlPro.

В любом случае Str.last_chars здесь не особенно полезен. Не работает, если имя файла короче суффикса. Кстати, ваш код никогда не будет совпадать, потому что ".osc2" это 5 символов, что никогда не равно last_chars x 4.

Модуль Filename из стандартной библиотеки имеет функции для извлечь и проверить расширение файла. Вам не нужно выполнять какие-либо манипуляции со строками.

Я не знаю, что вы считаете «безобразным адом», но, кроме ошибки с манипуляциями со строками, я не вижу никаких проблем с вашим кодом , Перечислять совпадения и фильтровать их совершенно идиоматично c.

let list_osc2 = 
  let list_files = Sys.readdir "tests/osc2/expected/pp" in
  List.filter (fun name -> check_suffix name ".osc2") (Array.to_list list_files)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...