Я разработчик PHP, который пытается получить некоторое знание Ruby. Одним из проектов, над которыми я сейчас режу зубы, является инструмент аудита исходного кода, который сканирует файлы webapp для потенциально опасных функций на нескольких языках веб-программирования. Когда совпадения найдены, скрипт сохраняет соответствующую информацию в классе poi
(точка интереса) для отображения позже.Динамическое создание многомерного хэша в Ruby
Пример экземпляра этого класса будет выглядеть примерно так (по образцу в YAML):
poi:
file_type: "php"
file: "the-scanned-file.php"
line_number: 100
match: "eval()"
snippet: "echo eval()"
На дисплее, я хочу организовать эти достопримечательности, как так:
- file_type
-- file
--- match (the searched payload)
Таким образом, , перед представлением, я пытаюсь структурировать плоский массив объектов poi
в хеш-зеркалирование структуры выше. Это позволит мне просто перебрать элементы хэша, чтобы создать желаемую организацию на экране. (Или, по крайней мере, это план.)
И теперь, для моего вопроса: как мне это сделать в Ruby?
В PHP, я мог бы сделать что-то вроде этого действительно легко:
<?php
$sorted_pois = array();
foreach($points_of_interest as $point){
$sorted_pois[$point->file_type][$point->file][$point->match][] = $point;
}
?>
Я пытался переводить эту мысль из PHP на Ruby, как это, но безрезультатно:
sorted_pois = {}
@points_of_interest.each_with_index do |point, index|
sorted_pois[point.file_type.to_sym][point.file.to_sym][point.match.to_sym].push point
end
I Я потратил несколько часов на это, и я как бы ударился головой о стену в этот момент, так что, по-видимому, я вне базы. Каков правильный способ справиться с этим в Ruby?
Update:
Для справки, это точный метод, который я определил:
# sort the points of interest into a structured hash
def sort
sorted_pois = {}
@points_of_interest.each_with_index do |point, index|
sorted_pois[point.file_type.to_sym][point.file.to_sym][point.match.to_sym].push point
end
end
Это ошибка я получаю, когда я запускаю код:
./lib/models/vulnscanner.rb:63:in `sort': undefined method `[]' for nil:NilClass (NoMethodError)
from /usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `each_with_index'
from ./lib/models/vulnscanner.rb:62:in `each'
from ./lib/models/vulnscanner.rb:62:in `each_with_index'
from ./lib/models/vulnscanner.rb:62:in `sort'
from ./webapp-vulnscan:69
Линия 62 (как вы, вероятно, можете вывести), это линия, в частности:
@points_of_interest.each_with_index do |point, index|
В качестве дополнительной ссылки, вот что (фрагмент) @points_of_interest
выглядит при преобразовании в YAML:
- !ruby/object:PoI
file: models/couponkimoffer.php
file_type: php
group: :dangerous_functions
line_number: "472"
match: `
snippet: ORDER BY `created_at` DESC
- !ruby/object:PoI
file: models/couponkimoffer.php
file_type: php
group: :dangerous_functions
line_number: "818"
match: `
snippet: WHERE `company_slug` = '$company_slug'
- !ruby/object:PoI
file: models/couponkimoffer.php
file_type: php
group: :dangerous_functions
line_number: "819"
match: `
snippet: ORDER BY `created_at` DESC
Что с чем ты иметь? Это приводит к ошибкам или является результатом не того, что вы ожидаете? Кроме того, предоставление ввода/вывода выборки полезно. –
@AndrewMarshall, спасибо, что посмотрели. Я просто обновил вопрос. –