【问题标题】:retrieve hash from the file in ruby从红宝石文件中检索哈希
【发布时间】:2014-05-02 11:21:40
【问题描述】:

我有一个场景,我在abc file 中存储了一个哈希值。

这是我的 abc 文件

{
    "access_key"=>"XXXXXXXXXXXXXXXXXXX", 
    "secret_access_key"=>"XXXXXXXXXXXXXXXXXXX",  
    "bucket"=>"XXXXXXXXXXXXXXXXXXX", 
    "name_prefix"=>"my_videos/178/4406/", 
    "x-amz-security-token"=>"AQoDYXdzEBQa4AK5TxvWJM/xsONxl/9ZDVxJc0s9CY+A/yrbhF7/3fK8ZWxlEibuMiEGEzzJ+UcfXBKdOu7oJR2X8l9HqhAD5JmZ2+JJuZjVG9hqP1RPkoQysxXBCeGdOVqOSPk0kW/5sPUG4bjiBbP8WGR9ibRkEq3tGfYazC//UuAZIJDUe+R8FSZay2Izx8BZj3XwPWjF3DsSaWcTIbsRQlMlEmQHD6n7BDv022hNfX13Zf4U18lzft8Sv98etslTC3pbmRd6AbM1I6rK6hn6fJKmrcHYHD3OCAcC2JDWzsv270gBzv1wY4Uma3fU/3HapMIQ5Xb7TU7hlhdHDYjo76FgPRLUPTnw9bXKuWHjG9LVONJuu1aqymlY9iEwASq7Ugk/8w6IMGsRxSeFlbhI689HThukObsQKCpUk2URQwL21fu7/fExUWA5pU5LPwvDgxo0V4Q7JplNwdnXS62Dt3PEj/DmuxfXIM3mjZsF", 
    "expires"=>1999196123
}

现在我必须检索该哈希。这样我就可以读取文件并获取access_keyname_prefix的值。

如何在 ruby​​ 中做到这一点?

【问题讨论】:

    标签: ruby hash ruby-1.9.3 ruby-1.9


    【解决方案1】:

    使用eval

    文件.txt

    {
      "access_key"=>"XXXXXXXXXXXXXXXXXXX", 
        "secret_access_key"=>"XXXXXXXXXXXXXXXXXXX",  
        "bucket"=>"XXXXXXXXXXXXXXXXXXX", 
        "name_prefix"=>"my_videos/178/4406/", 
        "x-amz-security-token"=>"AQoDYXdzEBQa4AK5TxvWJM/xsONxl/9ZDVxJc0s9CY+A/yrbhF7/3fK8ZWxlEibuMiEGEzzJ+UcfXBKdOu7oJR2X8l9HqhAD5JmZ2+JJuZjVG9hqP1RPkoQysxXBCeGdOVqOSPk0kW/5sPUG4bjiBbP8WGR9ibRkEq3tGfYazC//UuAZIJDUe+R8FSZay2Izx8BZj3XwPWjF3DsSaWcTIbsRQlMlEmQHD6n7BDv022hNfX13Zf4U18lzft8Sv98etslTC3pbmRd6AbM1I6rK6hn6fJKmrcHYHD3OCAcC2JDWzsv270gBzv1wY4Uma3fU/3HapMIQ5Xb7TU7hlhdHDYjo76FgPRLUPTnw9bXKuWHjG9LVONJuu1aqymlY9iEwASq7Ugk/8w6IMGsRxSeFlbhI689HThukObsQKCpUk2URQwL21fu7/fExUWA5pU5LPwvDgxo0V4Q7JplNwdnXS62Dt3PEj/DmuxfXIM3mjZsF", 
        "expires"=>1999196123
    }
    

    代码:

    my_hash = eval(File.read('file.txt'))
    => {"access_key"=>"XXXXXXXXXXXXXXXXXXX",
     "secret_access_key"=>"XXXXXXXXXXXXXXXXXXX",
     "bucket"=>"XXXXXXXXXXXXXXXXXXX",
     "name_prefix"=>"my_videos/178/4406/",
     "x-amz-security-token"=>
      "AQoDYXdzEBQa4AK5TxvWJM/xsONxl/9ZDVxJc0s9CY+A/yrbhF7/3fK8ZWxlEibuMiEGEzzJ+UcfXBKdOu7oJR2X8l9HqhAD5JmZ2+JJuZjVG9hqP1RPkoQysxXBCeGdOVqOSPk0kW/5sPUG4bjiBbP8WGR9ibRkEq3tGfYazC//UuAZIJDUe+R8FSZay2Izx8BZj3XwPWjF3DsSaWcTIbsRQlMlEmQHD6n7BDv022hNfX13Zf4U18lzft8Sv98etslTC3pbmRd6AbM1I6rK6hn6fJKmrcHYHD3OCAcC2JDWzsv270gBzv1wY4Uma3fU/3HapMIQ5Xb7TU7hlhdHDYjo76FgPRLUPTnw9bXKuWHjG9LVONJuu1aqymlY9iEwASq7Ugk/8w6IMGsRxSeFlbhI689HThukObsQKCpUk2URQwL21fu7/fExUWA5pU5LPwvDgxo0V4Q7JplNwdnXS62Dt3PEj/DmuxfXIM3mjZsF",
     "expires"=>1999196123}
    

    不过,这只是针对您的情况的一种解决方法。我会建议你使用固定的数据格式,如JSONYAML 将数据保存在文件中,然后在代码中取回。

    【讨论】:

    • 错误。请解释拒绝投票的原因。我确实了解eval 的安全问题,并在我的回答中解决了这个问题。这应该是 OP 条件的解决方法。
    【解决方案2】:

    Ruby 的Hash.to_s 不是双向序列化,所以格式不能轻易反序列化。

    如果文件中的数据足够可预测,您可以将文件内容转换为更类似于 JSON 的格式,然后对其进行反序列化:

    require 'json'
    
    values = JSON.parse(file_contents.gsub("=>", ": "))
    
    values['access_key']
    # => "access_key"=>"XXXXXXXXXXXXXXXXXXX"
    values['name_prefix']
    # => "my_videos/178/4406/"
    

    如果您可以控制文件的写入方式,我建议您不要使用Hash.to_s,而是使用hash.to_json 来编写文件:

    puts values.to_json
    #=> {
    #=>     "access_key": "XXXXXXXXXXXXXXXXXXX", 
    #=>     "secret_access_key": "XXXXXXXXXXXXXXXXXXX",  
    #=>     "bucket": "XXXXXXXXXXXXXXXXXXX", 
    #=>     "name_prefix": "my_videos/178/4406/", 
    #=>     "x-amz-security-token": "AQoDYXdzEBQa4AK5TxvWJM/xsONxl/9ZDVxJc0s9CY+A/yrbhF7/3fK8ZWxlEibuMiEGEzzJ+UcfXBKdOu7oJR2X8l9HqhAD5JmZ2+JJuZjVG9hqP1RPkoQysxXBCeGdOVqOSPk0kW/5sPUG4bjiBbP8WGR9ibRkEq3tGfYazC//UuAZIJDUe+R8FSZay2Izx8BZj3XwPWjF3DsSaWcTIbsRQlMlEmQHD6n7BDv022hNfX13Zf4U18lzft8Sv98etslTC3pbmRd6AbM1I6rK6hn6fJKmrcHYHD3OCAcC2JDWzsv270gBzv1wY4Uma3fU/3HapMIQ5Xb7TU7hlhdHDYjo76FgPRLUPTnw9bXKuWHjG9LVONJuu1aqymlY9iEwASq7Ugk/8w6IMGsRxSeFlbhI689HThukObsQKCpUk2URQwL21fu7/fExUWA5pU5LPwvDgxo0V4Q7JplNwdnXS62Dt3PEj/DmuxfXIM3mjZsF", 
    #=>     "expires": 1999196123
    #=> }
    

    这将允许您跳过上面代码中的gsub,并且比目前的情况更加健壮。

    【讨论】:

      【解决方案3】:

      不要这样存放。将其存储在 yaml 文件中:

      access_key: XXXXXXXXXXXXXXXXXXX 
      secret_access_key: XXXXXXXXXXXXXXXXXXX
      bucket: XXXXXXXXXXXXXXXXXXX 
      name_prefix: my_videos/178/4406/ 
      x-amz-security-token: AQoDYXdzEBQa4AK5TxvWJM/xsONxl/9ZDVxJc0s9CY+A/yrbhF73fK8ZWxlEibuMiEGEzzJ+UcfXBKdOu7oJR2X8l9HqhAD5JmZ2+JJuZjVG9hqP1RPkoQysxXBCeGdOVqOSPk0kW/5sPUG4bjiBbP8WGR9ibRkEq3tGfYazC/UuAZIJDUe+R8FSZay2Izx8BZj3XwPWjF3DsSaWcTIbsRQlMlEmQHD6n7BDv022hNfX13Zf4U18lzft8Sv98etslTC3pbmRd6AbM1I6rK6hn6fJKmrcHYHD3OCAcC2JDWzsv270gBzv1wY4Uma3f/3HapMIQ5Xb7TU7hlhdHDYjo76FgPRLUPTnw9bXKuWHjG9LVONJuu1aqymlY9iEwASq7Ugk/8w6IMGsRxSeFlbhI689HThukObsQKCpUk2URQwL21fu7/fExUWA5pU5LPwvDgxo0V4Q7JplNwdnXS62Dt3PEjDmuxfXIM3mjZsF 
      expires: 1999196123
      

      然后只需加载它:

      my_hash = YAML.load File.open('/path/to/yaml/file')
      
      my_hash['access_key']     #=> 'XXXXXXXXXXXXXXXX' 
      

      【讨论】:

        猜你喜欢
        • 2012-12-19
        • 1970-01-01
        • 1970-01-01
        • 2011-08-10
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 2012-10-17
        • 1970-01-01
        相关资源
        最近更新 更多