Ruby中字符串的动态变量
我正在根据内容将文件的每一行复制到单独的文件中。每一行都以Ruby中字符串的动态变量,ruby,variables,dynamic-variables,Ruby,Variables,Dynamic Variables,我正在根据内容将文件的每一行复制到单独的文件中。每一行都以“foo”或“bar”开头,我希望读取每一行的前几个字符并动态更改文件名变量 readfile = File.open("myfile.txt", 'r') file_foo = File.open("file1.txt", 'w') file_bar = File.open("file2.txt", 'w') for line in readfile writefile = 'file_' + line[0..2] write
“foo”
或“bar”
开头,我希望读取每一行的前几个字符并动态更改文件名变量
readfile = File.open("myfile.txt", 'r')
file_foo = File.open("file1.txt", 'w')
file_bar = File.open("file2.txt", 'w')
for line in readfile
writefile = 'file_' + line[0..2]
writefile.write(line)
end
file_foo.close
file_bar.close
这会引发错误,因为变量writefile
引用字符串“file\u foo”
或“file\u bar”
一个优雅的红宝石解决方案的建议?从文档中我看不到如果确实是这样的话,如何在这里应用send
方法。对文件进行散列:
readfile = File.open("myfile.txt", 'r')
files = {
'foo' => File.open("file1.txt", 'w'),
'bar' => File.open("file2.txt", 'w')
}
for line in readfile
files[line[0..2]].write(line)
end
files.each {|k, v| v.close}
我想你在找
eval
。它将获取一个字符串,并在当前上下文中将其作为Ruby代码进行计算。因此,您的示例变成:
readfile = File.open("myfile.txt", 'r')
file_foo = File.open("file1.txt", 'w')
file_bar = File.open("file2.txt", 'w')
for line in readfile
eval('file_' + line[0..2]).write(line)
end
filefoo.close
filebar.close
但是,您要求采用“红宝石”方法。使用eval
肯定不是鲁比主义的方法。也不能用于
循环。我将尝试一种更为红宝石主义的方法:
infile = "myfile.txt"
foofile = "file1.txt"
barfile = "file2.txt"
def append_to_file(path, content)
File.open(path, 'a') { |f| f << content }
end
IO.readlines(readfile).each do |line|
case line
when /^foo/
append_to_file(foofile, line)
when /^bar/
append_to_file(barfile, line)
end
end
infle=“myfile.txt”
foofile=“file1.txt”
barfile=“file2.txt”
def append_到_文件(路径、内容)
File.open(路径'a'){| f | f您不能使用send
,因为您试图将字符串转换为的不是方法,而是局部变量
readfile = File.open("myfile.txt", 'r')
file_foo = File.open("file1.txt", 'w')
file_bar = File.open("file2.txt", 'w')
for line in readfile
writefile = 'file_' + line[0..2]
writefile.write(line)
end
file_foo.close
file_bar.close
在Ruby 2.1中,您将能够使用绑定#局部变量_get
for line in readfile
writefile = binding.local_variable_get(:"file_#{line[0..2]}")
writefile.write(line)
end
另外,请记住,在写入模式(“w”)下打开文件将在后续写入时覆盖文件内容取而代之。谢谢。为什么“eval”不是Rubyist方法?您的第一个答案看起来肯定更经济。使用eval
会有很多危险。例如,它会产生巨大的安全漏洞,并且几乎不可能在更大的系统中调试。以前从未遇到过这种情况……看起来很有趣。为什么要使用t与if-else语句相对应的是什么?@Jonathan_W:一点也不经济。eval
可能是Ruby中效率最低的一种方法,一个安全漏洞,对于这种类型的东西来说,丑陋且杀伤力过大。这似乎是一个非常有用的补充……我看到预览现在已经出来了,但现在是最后一个了update@Jonathan_W:谢谢。这是一个简单的专业问题,它需要一个简单的解决方案。实际问题的好解决方案!对不起,我必须在这里吹毛求疵。首先,正如我前面提到的,Ruby程序员从不使用进行循环。就像以前一样。他们使用each
等方法。其次,如果文件中的一行不完全以“foo”或“bar”开头,这个程序就会崩溃。一个第三,这无法正确处理打开的文件。如果程序在任何地方失败,您将有3个打开的文件需要手动清理。即使没有失败,您仍将有一个打开的文件需要清理(myfile.txt)。如果你想学习Ruby,你需要注意这些事情。@rickyrickyrice:我知道。它是想解决OP代码中的主要问题,而不是开始代码审查。把这些评论留给OP,而不是我。OP要求Ruby解决方案,这是我选择它的唯一原因。而且,现在读到它,我的评论被认为非常有敌意,对此我很抱歉。我最后一个吹毛求疵的地方是:在“w”模式下打开文件会在后续写入中覆盖该文件。您需要在“a”模式下打开它。