2

文字列を1行ずつ変更する単純な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#で実装されたユーティリティはどのようになりますか?このPythonバージョンよりもLOCが短く、読みやすいでしょうか?

追加した

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

Pythonバージョンの正規表現が何をするのかわからないため、F#バージョンの完全な例は示しません。ただし、優れた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 に答える