読者です 読者をやめる 読者になる 読者になる

ruby と仲良くなろうかな、とか。

ruby

 ruby を触ってみてます。

 環境変数 PATH というものがありますよね。

echo $PATH

まぁこれが見にくい(↓こんなん)。
/Users/kura/.rvm/gems/ruby-1.9.3-p125/bin:/Users/kura/.rvm/gems/ruby-1.9.3-p125@global/bin:/Users/kura/.rvm/rubies/ruby-1.9.3p125/bin:/Users/kura/.rvm/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

 で、「:」で区切られたパスをリスト表示するスクリプトを書いてみました。

# encoding: utf-8

paths = ENV['PATH']
s = paths.split(/:/)
s.each_with_index {|path,index|
    puts "#{index + 1} #{path}"
}

実行結果がこちら↓


1 /opt/local/bin
2 /opt/local/sbin
3 /opt/local/bin
4 /opt/local/sbin
5 /opt/local/bin
6 /opt/local/sbin
7 /Users/kura/.rvm/gems/ruby-1.9.2-p290/bin
8 /Users/kura/.rvm/gems/ruby-1.9.2-p290@global/bin
9 /Users/kura/.rvm/rubies/ruby-1.9.2-p290/bin
10 /Users/kura/.rvm/bin
11 /opt/local/bin
12 /opt/local/sbin
13 /usr/bin
14 /bin
15 /usr/sbin
16 /sbin
17 /usr/local/bin
18 /usr/X11/bin
 ↑この結果をよく見ると、どうも同じパスがいくつか登録されているようです。

 で、重複を無くしたいのでとりあえず Set コンテナを検索すると、すぐ見つかりました。
 『class Set』 Ruby 1.9.3 リファレンスマニュアル

 というわけでソースを修正...。

# encoding: utf-8

require "set"

paths = ENV['PATH']
s = paths.split(/:/).to_set.to_a
s.each_with_index {|path,index|
    puts "#{index + 1} #{path}"
}


1 /opt/local/bin
2 /opt/local/sbin
3 /Users/kura/.rvm/gems/ruby-1.9.2-p290/bin
4 /Users/kura/.rvm/gems/ruby-1.9.2-p290@global/bin
5 /Users/kura/.rvm/rubies/ruby-1.9.2-p290/bin
6 /Users/kura/.rvm/bin
7 /usr/bin
8 /bin
9 /usr/sbin
10 /sbin
11 /usr/local/bin
12 /usr/X11/bin
 ↑この結果が何だか見にくいので、パスの深さでソートしてみました。
 ソースを修正。

# encoding: utf-8

require "set"

paths = ENV['PATH']
s = paths.split(/:/).to_set.to_a.sort {|a,b|
    a.split("/").length <=> b.split("/").length
} 
s.each_with_index {|path,index|
    puts "#{index + 1} #{path}"
}

 その実行結果↓。


1 /bin
2 /sbin
3 /usr/sbin
4 /usr/bin
5 /opt/local/bin
6 /usr/X11/bin
7 /usr/local/bin
8 /opt/local/sbin
9 /Users/kura/.rvm/bin
10 /Users/kura/.rvm/gems/ruby-1.9.2-p290@global/bin
11 /Users/kura/.rvm/rubies/ruby-1.9.2-p290/bin
12 /Users/kura/.rvm/gems/ruby-1.9.2-p290/bin
 おkおk。

 重複を消すために Set とか使いましたけど Array.uniq っていうそのままズバリなものがあるんですね。ついでにソースを短くしておしまい。

# encoding: utf-8

ENV['PATH'].split(/:/).uniq.sort {|a,b|
    a.split("/").length <=> b.split("/").length
} .each_with_index {|path,index|
    puts "#{index + 1} #{path}"
}