2

我有一个简单的 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)

或如本答案中所述。

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)
4

1 回答 1

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 中编写几乎相同的东西(即,无需显式连接字符串并使用一些高阶函数或理解语法来处理集合)。

于 2011-05-26T20:13:52.363 回答