ruby HASH, 正则, 数组

长时间不用经常忘记, 还是总结下常用的, 每次总结自己用到的小例子

文件名排序

描述: 文件名包含两段 num1_num2.jpg, 在文件浏览器看到的顺序和find 命令得到的文件顺序不一致, 因此希望通过脚本修改.
这里主要展示 hash 排序

lines = File.open(forg_list).readlines

mp={}
lines.each do |line|
    line =~ /^(\d+)_(\d+)/
    #puts $1, $2
    mp[$1] = {} unless mp.has_key? $1
    v2=$2

    #puts v2, "%02d"%v2
    #exit
    mp[$1]["%02d"%v2]=v2
end

File.open(flist, "w") do |fp|
    mp.each do |k1, v1| 
        v1 = v1.sort { |k, v| k.first <=> v.first }.to_h
        v1.each do |k2, v2| 
            fp.puts "#{k1}_#{v2}.jpg"
        end
    end 
end

方法二:
https://stackoverflow.com/questions/51341134/how-to-sort-file-names-in-ruby

pics = pics.sort_by do |name|
           name =~ /\/(\d+)\.jpg/
           $1.to_i
           # 其实可以返回一个数组, 只要第一个是inter就行
       end

正则

下面演示了如何生成部分正则字符串然后使用。 该功能就是选取标号的行数。

ids=%w[1 2 11 12 21 22 9 10 19 20 29 30]

ss=ids.join "|"
ss="(?:#{ss})"
#puts ss
#exit
while line = ARGF.gets
    puts line.strip if line =~ %r@_#{ss}_@
end

scan 似乎必须用map,否则返不回正确的结果

ss.scan(/(\"\S+\")/).map{|e| e[0]}.join ","

数组

inject

a=["a", "b", "c"]
a.inject(0){|s, e| s+e.bytes[0]}

如果 a 是 字符,就用 e[0]
反之是 97.chr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值