2016-08-20 10 views
0

は想像置き換える変数の後にテキスト(.txt)ファイルの内容を返します。ルビーは、私は2つのファイルを持っている

Iamascript.rb 

... 
variable = "period" 
... 

.txtファイルの内容を読み込み、puts'ingする前に変数を挿入する方法はありますか? RB-スクリプトを実行すると、.txtファイルが動的である

This is a sentence with a period. 

ものでなければならないとき、これは私の出力を意味します。

答えて

2

あなたが探していることは一般的にテンプレートと呼ばれ、あなたはテンプレート言語を基本的に定義しています。 Rubyは標準ライブラリにERbというテンプレート言語を実際に同梱していますので、テンプレート言語の構文を少し変更したい場合は、独自のものを作成する必要はありません。

A.TXT

This is a sentence with a <%=variable%>. 

Iamascript。rb

require 'erb' 

variable = 'period' 

puts ERB.new(File.read('A.txt')).result(binding) 
# This is a sentence with a period. 
+0

ありがとう、これは私の魅力のように動作します。外部の.txtまたは.rbファイルからハッシュを読み込み、そのキー(および値)を「メイン」コードでこれを使用することも可能ですか? – Phero

+0

動作のない純粋なデータを読みたい場合は、プログラミング言語ではなく純粋なデータ記述言語を使用する方がはるかに優れています(より簡単で*安全です)。 (そして、結局のところ、ERbはあなたのすべてのデータを削除するコード、あなたのハードディスクをフォーマットする、バックドアを開始するコードなど、任意の* Rubyコードを埋め込むことができます) XML、YAML、JSONなどのデータ言語を使用します。 (XMLではなく、JSONやYAMLを好むでしょう。観客、つまりそのファイルを編集しなければならない人々に依存します。) –

+0

プロジェクトは純粋なデータ抽出に関するものではなく、テンプレートを使用するのは便利です。私はちょうどいくつかのコードに複数の(異なる)出力を持ち、すべてをコード化しなくてもテンプレートを使用するというアイディアが好きです。しかし、セキュリティ上の懸念があると言えば、毎回自分のコードを変更するでしょう。 – Phero

0

「明らかな」(しかし悪い)解決策があります。それはevalです。 evalあなたがそれを与えるコードのビットを実行します。

これはセキュリティ上の問題ですが、#{...}に複雑な式が必要な場合には、探しているものになる可能性があります。

セキュリティについて少しでも気にしているのなら、もっと正しい方法は、Rubyのフォーマット演算子%(Pythonに似ています)を使用することです。

template = "the variable's value is %{var}" 
puts template % {var: "some value"} => prints "the variable's value is some value" 
0

ファイル"A.txt"がテキストの単一の行(または、この行がファイルから抽出される)を含むと仮定:

s1 = 'This is a sentence with a #{my_var}' 

及び第二のファイル、"Iamascript.rb"、含ま:

s2 =<<_ 
line of code 
    line of code 
    my_var = "period" 
    line of code 
line of code 
_ 
    #=> "line of code\n line of code\n my_var = 'period'\n line of code\nline of code\n" 

これらのファイルを作成しましょう:

File.write("A.txt", s1) 
    #=> 35 
File.write("Iamascript.rb", s2) 
    #=> 78 

"A.txt"の最初の行を読み取って、"\#{"で始まり"}"で終わる文字列を抽出し、その文字列から変数名を抽出します。

r1 =/
    \#\{ # match characters 
    [_a-z]+ # match > 0 understores or lower case letters 
    \}  # match character 
    /x  # free-spacing regex definition mode 

s1 = File.read("A.txt") 
    #=> "This is a sentence with a #{my_var}" 
match = s1[r1] 
    #=> "\#{my_var}" 
var_name = match[2..-2] 
    #=> "my_var" 

"Iamascript.rb"を読み、次の正規表現に一致する行を探します。

r2 =/
    \A   # match beginning of string 
    #{var_name} # value of var_name 
    \s*=\s*  # match '=' and surrounding whitespace 
    ([\"'])  # match a single or double quote in capture group 1 
    ([^\"']+) # match other than single or double quote in capture group 2 
    ([\"'])  # match a single or double quote in capture group 3 
    \z   # match end of string 
    /x   # free-spacing regex definition mode 
#=>/
# \A   # match beginning of string 
# my_var  # value of var_name 
# \s*=\s*  # match '=' and surrounding whitespace 
# ([\"'])  # match a single or double quote in capture group 1 
# ([^\"']+) # match other than single or double quote in capture group 2 
# ([\"'])  # match a single or double quote in capture group 3 
# \z   # match end of string 
# /x 

一致が見つかった場合は、テキスト置換、他のリターンnil"A.txt"から行を返します。

if File.foreach("Iamascript.rb").find { |line| line.strip =~ r2 && $1==$3 } 
    str.sub(match, $2)  
else 
    nil 
end 
    #=> "This is a sentence with a period" 
関連する問題