我目前正在浏览 Real World Haskell 这本书,本书中的一个练习要求读者使用**
实现文件名匹配,这与{ {1}},但也会在文件系统中查找子目录。下面是我的代码片段和注释(目前有很多重复),你可以在下面找到有关代码的其他信息。我认为发布的代码足以解决问题,无需在此列出整个程序。
*
case splitFileName pat of
("", baseName) -> do -- just the file name passed
curDir <- getCurrentDirectory
if searchSubDirs baseName -- check if file name has `**` in it
then do
contents <- getDirectoryContents curDir
subDirs <- filterM doesDirectoryExist contents
let properSubDirs = filter (`notElem` [".", ".."]) subDirs
subDirsNames <- forM properSubDirs $ \dir -> do
namesMatching (curDir </> dir </> baseName) -- call the function recursively on subdirectories
curDirNames <- listMatches curDir baseName -- list matches in the current directory
return (curDirNames ++ (concat subDirsNames)) -- concatenate results into a single list
else listMatches curDir baseName
(dirName, baseName) -> do // full path passed
if searchSubDirs baseName
then do
contents <- getDirectoryContents dirName
subDirs <- filterM doesDirectoryExist contents
let properSubDirs = filter (`notElem` [".", ".."]) subDirs
subDirsNames <- forM properSubDirs $ \dir -> do
namesMatching (dirName </> dir </> baseName) -- call the function recursively on subdirectories
curDirNames <- listMatches dirName baseName -- list matches in the passed directory
return (curDirNames ++ (concat subDirsNames)) -- concatenate results into a single list
是我正在寻找的模式(例如pat
或*.txt
)。
C:\\A\[a-z].*
是一个将文件路径拆分为目录路径和文件名的函数。如果我们在splitFileName
中仅指定文件名,则元组的第一个元素将为空。
pat
,则 searchSubDirs
会返回True
。
**
返回与目录中的模式匹配的文件名列表,用listMatches
代替**
。
*
是我发布的摘录函数的名称。
当我只传递文件名时,程序仅在当前目录和第一级子目录中搜索它。当我传递完整路径时,它只在指定的目录中搜索。看起来案例namesMatching
没有正确递归。我已经看了一段时间的代码了,我无法弄清楚问题出在哪里。
如果需要更多信息,请在评论中告诉我,我会添加问题所需的一切。
答案 0 :(得分:2)
这是一个问题:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!DOCTYPE html>
<body bgcolor="#646464">
<div class="mainWrapper">
<div id="Header">Header</div>
<div id="ContentWrapper">
<div id="Left_Nav">
<h3>Navigation</h3>
<ul class="list_vertical">
<li>Home</li>
<li>Link 0</li>
<li>Link 1</li>
<li>Link 2</li>
<li>Link 3</li>
</ul>
</div>
<div id="Content">Content</div>
</div>
<div id="Footer">
<div class="table">Footer
<ul class="list_horizontal">
<li class="hor">Link 0</li>
<li class="hor">Link 1</li>
<li class="hor">Link 2</li>
<li class="hor">Link 3</li>
</ul>
</div>
</div>
</div>
</body>
contents <- getDirectoryContents dirName
subDirs <- filterM doesDirectoryExist contents
仅返回目录的叶名称,因此在调用{{getDirectoryContents
之前,您必须先将dirName
(以及/
)添加到contents
的元素中。 1}}。