Ghci как запустить файл

Обновлено: 06.07.2024

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

Теперь немного ссылок и справочной информации:

В Haskell Platform для работы с регулярными выражениями предлагается использовать модуль Text.Regex.Posix. Проблема в том, что в нем реализованы регулярные выражения Posix, а я всю жизнь работал с регулярными выражениями Perl. Хоть разница между ними и небольшая, но мне так и не удалось понять, как в регулярных выражениях Posix будет выглядеть аналог (abc)(?:def)(ghi) и возможно ли его вообще написать. Также утверждается, что Text.Regex.Posix работает медленно, так что я решил установить Text.Regex.PCRE.

Установка новых модулей происходит очень просто:

Вообще, мне интересно, что мешало использовать в Cabal и самом языке одинаковые обозначения модулей? Например, позже выяснилось, что Data.String.Utils входит в пакет MissingH. Никакой связи между модулями языка и пакетами!

Дополнение: О статической линковке PCRE можно прочитать в 4-м параграфе статьи Кроссплатформенное GUI приложение на Haskell. Об использовании этой библиотекой напрямую вы можете прочитать в заметке Работа с регулярными выражениями в C/C++ при помощи библиотеки libpcre.

После установки можно немного потестировать модуль в ghci:

-- начало программы
main = do
args <- getArgs -- получили аргументы
parseArgs args -- обрабатываем их

-- если передано меньше двух аргументов
parseArgs _ = do
progName <- getProgName
putStrLn $ "Usage: " ++ progName ++ " <url> <outfile>"
exitWith $ ExitFailure 2

-- преборазуем rtmp-ссылку и имя выходного файла в команду
genCmd :: String -> String -> String
genCmd rtmpUrl outFile =
let regex = "(?i)^(rtmp://[^ \" /]+/)([^ \" ]*?/)(mp4:[^ \" ]*)$"
match = rtmpUrl =

-- выдираем rtmp-ссылку из xml файла
xmlToRtmpUrl :: String -> String
xmlToRtmpUrl xml =
let regex = "(?i)<! \\ [CDATA \\ [(rtmp://[^ \\ ]]+) \\ ] \\ ]>"
match = xml =

my $url = shift ;
my $outfile = shift ;

die "Usage: $0 <url> <outfile> \n "
unless $url and $outfile ;

$url = $1 ;
print "Video url: $url \n " ;

Читайте также: