2017-02-18 73 views
1

我有這樣一個路徑:什麼是分割後存儲和打印值的最有效方式?

「/ Cygwin的/家庭/學習/ XYZ」

,我想:

DIR1 = 「家」和dir2 =「xyz」

所以我寫了這個Ruby代碼來獲取輸出:

path = "/cygwin/home/learn/xyz" 
    a = path.split(/\//) 
    dir1 = a[2] 
    puts dir1 #home 
    dir2 = a[4] 
    puts dir2 #xyz 

有沒有什麼有效的方式做到這一點?

回答

0

沒有大的改進空間,但有兩個:

_, _, home, _, dir = "/cygwin/home/learn/xyz".split('/') 
home 
#⇒ "home" 
dir 
#⇒ "xyz" 

不要通過正則表達式拆分時,你可以通過字符串分割,不產生中間數組對象。


此外,還有一個可以使用正則表達式在這裏(這是效率較低,但可能更通用):

m = "/cygwin/home/learn/xyz".match(
     %r|\A/\w+/(?<home>\w+)/\w+/(?<dir>\w+)\z|) 
m.captures 
#⇒ ["home", "xyz"] 
m[:home] 
#⇒ "home" 
m[:dir] 
#⇒ "xyz" 
2

與上一個簡單的分裂「/」做路徑處理時,有許多極端情況不處理。例如,/cygwin/home/learn/xyz/cygwin/home/learn/xyz/將以不同的方式分割。所以將/cygwin//home/learn/xyz

你可以用一些想法來解決這個問題。

string.split(/\/+/).reject { |p| p.empty? } 

但這並不是操縱路徑的唯一危險。例如:你在Windows上,你將在其中獲得路徑\

而是使用Pathname進行路徑操作。它可以做很多很多事情。 Pathname#each_filename會給你所有的作品作爲一個數組。

require "pathname"; 
# ['cygwin', 'home', 'learn', 'xyz'] 
puts Pathname.new("/cygwin/home/learn/xyz").each_filename.to_a 

儘管使用路徑名慢了大約3倍,但它更簡單和更安全,並且路徑名非常有用。文件操作不會成爲您的性能瓶頸,在您開始優化之前,始終需要進行配置。使用您節省的時間無需編寫和調試路徑操作代碼來執行更重要的優化。

0
dir1, dir2 = path.split('/').reject{|p| p.empty?}.values_at(1,3) 
相關問題