ie-developers / ie-questions

public questions for ie students.
10 stars 0 forks source link

eval syntax error #25

Closed kazuminn closed 9 years ago

kazuminn commented 9 years ago

ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin14.0]

eval関係でerrorが出るのですが、どう直せばいいのか教えて欲しいです。

どんなコード

グノシーの記事のタイトルを複数取って来て、一つの記事に対してnatto(mecabのラッパ-)を実行して名詞の キーワードを辞書列順に部分木に挿入する。(一つの記事に、一つの木)

コード

https://gist.github.com/kazuminn/2949ee502fa491b0b088

error

/Users/kinoshita/nibunnki.rb:185:in `eval': (eval):1: syntax error, unexpected tIDENTIFIER, expecting end-of-input (SyntaxError)
...10【あぷまが調べ6/29〜7/5】 = Tree.new
...                               ^   
        from /Users/kinoshita/nibunnki.rb:185:in `block (2 levels) in 
' from /Users/kinoshita/nibunnki.rb:184:in `times' from /Users/kinoshita/nibunnki.rb:184:in `block in
' from /Users/kinoshita/.anyenv/envs/rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/nokogiri-1.6.6.2/lib/nokogiri/xml/node_set.rb:187:in `block in each' from /Users/kinoshita/.anyenv/envs/rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/nokogiri-1.6.6.2/lib/nokogiri/xml/node_set.rb:186:in `upto' from /Users/kinoshita/.anyenv/envs/rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/nokogiri-1.6.6.2/lib/nokogiri/xml/node_set.rb:186:in `each' from /Users/kinoshita/nibunnki.rb:175:in `
'
tompng commented 9 years ago

textの中身に、空白文字やカンマ括弧、四則演算記号その他いろいろが含まれてたりするからですね、

text = '@'+'お わ た'
eval "#{text} = Tree.new"
@お わ た = Tree.new
(た=Tree.new) #代入
わ (た=Tree.new) #メソッド呼び出し
@お (わ (た=Tree.new) #メソッド呼び出しぽいけど@がついてるからインスタンス変数、解釈不能

instance_variable_set text, Tree.new が代わりに使えますが instance_variable_set/instance_variable_setを両方使うくらいなら

@all_posts[title] = Tree.new
@all_posts[title].each do end

でいいんじゃないかなと思います

tompng commented 9 years ago

記事のタイトルがたまたま「Q.A なぜ, `rm -rf`, は危険なのか」だった場合

eval "@Q.A `rm -rf`, は危険なのか = Tree.new"
#↑↓ 同じような形をしてるのでrubyの構文として正しくて、普通に外部コマンドが実行されてしまいそう?
@array.push `rm -rf`, (hoge = 3)
kazuminn commented 9 years ago
@all_posts[title] = Tree.new
@all_posts[title].each do end

ちょっと、わかんないです。

kazuminn commented 9 years ago

あ、もしかして、 textを短くして、文字と数字だけにすればいいので

 eval("#{text} = Tree.new")
 eval("#{text}[array[x]] = x")

すればよい。ですか?

なら

text = "@" + node[:href].split("/")[-1]

すれば、urlの/から$まで取れる。 /から$までは、文字か数字なので大丈夫感。

kazuminn commented 9 years ago

解決したっぽいです。

ありがとうございました。