回覆列表
  • 1 # 使用者7013550038014

    這其實是一個好問題。Perl語言入門那本書裡提到:當你問到這個問題的時候,說明你有了一些進步;而當你明白為什麼通常都不需要這個特性的時候,說明你又有了一些進步。

    如果你想在執行時把一個變數的字串內容當做另一個變數的名字,說明語言真的在執行時是透過字串的名字來訪問變數的。而C、C++、Fortran、Rust之類的高效能語言都不這麼做,因為這相當於執行時進行查詢,非常耗計算力。他們在編譯時就把變數轉換成了“固定”的地址呼叫,執行時並不存在變數名這個東西。

    即使對於能夠這麼做的語言,也通常不鼓勵你這麼做。這是因為變數名是程式的一部分,這麼做相當於在用資料去修改程式,不但非常容易混亂,而且在大程式裡這是潛在的安全性問題。

    實際上你需要的是另一種東西:鍵值對的查詢表,鍵是字串,值是你需要的東西。在C++裡,你可以簡單地用標準庫的std::map或者std::unordered_map。

    ==========

    補充:允許你這麼做的語言,通常都:

    很古老;缺乏變數引用的能力,必須這麼做;自己放棄治療,不打算用來構建大型程式。

    我知道的有shell指令碼、CMake、Perl。這裡面,shell很古老;CMake是構建指令碼,不是通用語言;Perl並不鼓勵你這麼做,use strict之後也不允許你這麼做。

    ================

    繼續補充:

    現在很多語言透過在直譯器裡增加最佳化步驟、中間程式碼編譯到native code一類的技術,可以極大地改善執行效率。

    不過即使如此,你原本就需要付出的代價是不能被減少的。比如這個題目裡提到的執行時符號查詢,即使你用C++做,也依然不能免除一次字串hash查詢。

    ===================

    對於題目增加內容的補充:

    多層不定連線的問題,顯然需要使用圖來解決。首先自己定義好節點物件和邊物件,然後也許需要一些全域性的單步關係對映表(比如簡單的誰的父是誰、誰的子是誰)。剩下的事情,基本就是一些圖論的演算法問題。

    反正無論如何,你也不應當使用動態產生變數來搞這種事,實際上僅僅這樣也搞不定這種事。

    如果你不需要在後臺解決這個問題,可以接受互動程式,那你可以使用cytoscape。這個軟體可以從兩兩關係的列表生成網路,帶有一些分析和排版功能,常用於生物學代謝調控網路的視覺化和分析。

  • 中秋節和大豐收的關聯?
  • 藏茶屬於什麼茶?