我有一个简单的python实用程序代码,可以逐行修改字符串。代码如下。
import re
res = ""
with open("tclscript.do","r") as f:
lines = f.readlines()
for l in lines:
l = l.rstrip()
l = l.replace("{","{{")
l = l.replace("}","}}")
l = re.sub(r'#(\d+)', r'{\1}',l)
l += r'\n'
res += l
res = "code="+res
with open("tclscript.txt","w") as f:
f.write(res)
使用F#实现的实用程序如何?可以在LOC中缩短并且比这个Python版本更容易阅读吗?
python代码在C#字符串中处理tcl脚本。 C#字符串中的“{”/“}应更改为”{{“/”}}“,”#“后面的数字应修改为”{}“括起来的数字。例如,#1 - > {1}。
这是工作示例
open System.IO
open System.Text.RegularExpressions
let lines =
File.ReadAllLines("tclscript.do")
|> Seq.map (fun line ->
let newLine = Regex.Replace(line.Replace("{", "{{").Replace("}", "}}"), @"#(\d+)", "{$1}") + @"\n"
newLine )
let concatenatedLine = Seq.toArray lines |> String.concat ""
File.WriteAllText("tclscript.txt", concatenatedLine)
或者如This answer中所述。
open System.IO
open System.Text
let lines =
let re = System.Text.RegularExpressions.Regex(@"#(\d+)")
[|for line in File.ReadAllLines("tclscript.do") ->
re.Replace(line.Replace("{", "{{").Replace("}", "}}").Trim(), "$1", 1) + @"\n"|]
let concatenatedLine = lines |> String.concat ""
File.WriteAllText("tclscript.txt", concatenatedLine)
答案 0 :(得分:4)
我不会给你一个F#版本的完整示例,因为我不确定Python版本中的正则表达式应该做什么。但是,一个不错的F#解决方案的一般结构看起来像这样:
let lines =
File.ReadAllLines("tclscript.do")
|> Seq.map (fun line ->
let newLine = line.Replace("{", "{{").Replace("}", "}}")
// Implement additional string processing here
newLine )
File.WriteAllLines("tclscript.txt", lines)
由于您的代码段是逐行工作的,因此我使用ReadAllLines
将文件作为行列表读取,然后使用Seq.map
将函数应用于每一行。可以使用WriteAllLines
将新的行集合写入文件。
正如评论中所提到的,我认为你可以在Python中编写几乎相同的东西(即没有明确地连接字符串并使用一些高阶函数或理解语法来处理集合)。