2次元Hashのkeyチェック方法

このQ&Aのポイント
  • YAMLで記述した設定ファイルを読み込んで、設定値があれば変数にセットし、なければdefault値を使うプログラムを書きたいです。
  • 現在のコードでは、2次元のHashのキーをチェックして変数にセットしていますが、もっと短く書く方法はありませんか?
  • confが3回も出てくるので、無駄を感じています。ハッシュのキーがyamlに記述されているかどうかわからない状況で書きたいです。
回答を見る
  • ベストアンサー

2次元Hashのkeyチェック方法

yamlで記述した設定ファイルを読み込んで、 設定値があれば、変数にセットし、 なければdefault値を使うプログラムを書いています。 こんな感じです。 [設定ファイル(yaml)] top_dir :  linux : /home/user  windows : C:/Documents [ruby] conf = YAML.load_file(filename) p conf #=> {"top_dir"=>{"linux"=>"/home/user", "windows"=>"C:/Documents"}} str = "/root" str = conf['top_dir']['linux'] unless conf['top_dir'].nil? or conf['top_dir']['linux'].nil? 最後の2次元Hashのキーをチェックして、変数にセットしている 部分ですが、もっと短く書けないでしょうか? 特にconfが3回も出てくるところに無駄を感じています。 ちなみに、Hashのキー'top_dir'と'linux'は yamlに記述があるかもしれないし、ないかもしれないという 前提でお願いします。 達人の方、ご教授お願いします。

  • Ruby
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

"top_dir" が無い場合、"linux" が無い場合をそれぞれ考慮するとなると、confと書くのは最低二回は要るでしょう。 nil? という判断条件をひっくり返すことで、conf["top_dir"]["linux"]を一回に出来ます。~.nil? が出てきたら見直した方が良いでしょうね。 str = conf["top_dir"] && conf["top_dir"]["linux"] || "/root" conf一回で済ませるパズル的解法としては、nilの添え字参照がエラーにならないようにする。 def nil.[](x) end str = conf["top_dir"]["linux"] || "/root" パズルの回答以外ではやめた方が良いでしょう。デバッグがしにくくなります。 begin str = conf["top_dir"]["linux"] || "/root" rescue str = "/root" end も駄目でしょう。こんな目的で例外を使ってはいけない。

ayudaia
質問者

お礼

ありがとうございました。参考になりました。

関連するQ&A

  • mv処理後の環境変数について

    いつもお世話になっております。 今回は、mv処理後圧縮するということです。 set DIR1 = /tmp set DIR2 = /work mv $DIR1/ファイル1 $DIR2/ファイル1 compress -f $DIR2/ファイル1 としたいのですが、mvで移動したファイル1を 変数設定して圧縮したいのですがどの様に記述きたら 良いでしょうか?

  • httpd.confでアップロードディレクトリを変更

    httpd.confで該当のディレクトリ内の、 httpd.confで、アップロード時のテンポラリディレクトリを変更したいのですが、 記述を調べてもでてきません。 (下記のように記述してみたのですが反映されません。 googleでごっそり出てくるかとおもいきや、具体的な記述が全く見つからず・・・) すみませんが、わかる方がいらっしゃれば教えてください。 <Directory "/home/project/hogehoge"> upload_tmp_dir "/home/tmp" </Directory>

    • ベストアンサー
    • PHP
  • Cシェルでエラーハンドリングする方法について

    Cシェルでエラーハンドリングする方法について 特定のファイルをしたのディレクトリに移動させる際、特定ファイルがなければ、処理を終了するという記述の仕方を教えていただきたいです。 すでに、以下のように記述をしてファイルを指定したディレクトリへ移動する動作確認はできています。 ------------------------------------------ set dir1=/export/home/username/test1_dir set dir2=/export/home/username/test2_dir mv ${dir1}/*.log /export/home/username/mv_dir mv ${dir2}/*.csv /export/home/username/mv_dir ------------------------------------------ この場合、*.log、*csvがディレクトリ内に存在すれば、移動先ディレクトリへ移動し ファイルがなければそのまま終了しています。 ファイルがなかったとしても、シェルが実行中のまま終わらなかったり エラーがでてしまうことはありませんでしたが、 念のため、ファイルが存在しない場合、何もせず処理を終了する というエラーハンドリング処理を入れたいと思うのですが、 どのように記述したらよいでしょうか? if (条件式) コマンド行 で実施ができるのか?と思うのですが どのような記述となりますでしょうか。

  • bat内での文字の置き換えについて

    環境変数に設定されている値を"と\を\でエスケープを行い、javaのクラスに渡したいです。(環境変数にはあらゆる英数記号がはいる可能性があります) set str=%TEST_PATH:\=\\% set str2=%str:"=\"% ↑という処理を行うことで、変換が出来る事はわかりましたが特殊記号が入った場合にうまく動きません。 又、"が先頭にある場合とそれ以外の場合だと挙動が異なる事に気づきました。 "が先頭にある場合は%TEST_PATH:\=\\%を"で囲むとエラーになり、それ以外では囲まないとエラーになるのはなんででしょうか? 理由と解決策を教えてください。 ~~~作成物~~~ 2つの値を環境変数に設定した場合。(「<>"&|,'\」などと設定するとうまくいかないです) TEST_PATH="<>\ TEST_PATH2=<>"\ ~~~bat~~~ @echo off echo start1 set str=%TEST_PATH:\=\\% echo %str% set str2=%str:"=\"% echo %str2% echo start2 set str="%TEST_PATH2:\=\\%" echo %str% set str2=%str:"=\"% echo %str2% echo end

  • Ruby ハッシュ継承クラス、作成方法について

    ハッシュを拡張し、値をキーで指定した範囲内から取得したいと思っているのですが、ハッシュと同じように作成できないのでしょうか? 試行錯誤してみたのですが、記述が分かりません・・・。 class Range_List < Hash  #  # 範囲に対応する、値を取得(速度が気になりますが・・・)  #  def [](other)   @list.each { |range, value|    return value if range === other   }   nil  end end # 角度 (0..1) に対応する、十キーのリストを作成 angle_to_direction = Range_List{  # => エラー。このような記述で呼び出したい  0.0625..0.1875 => 3,  0.1875..0.3125 => 2,  0.3125..0.4375 => 1,  0.4375..0.5625 => 4,  0.5625..0.6875 => 7,  0.6875..0.8125 => 8,  0.8125..0.9375 => 9,  0.9375..1    => 6,  0..0.0625    => 6 } # 角度対応の十キーを求める p angle_to_direction[0.1]  # => 3 どうかご回答お願いいたします。

    • ベストアンサー
    • Ruby
  • リファラーのデータ送信について

    こちらの質問(http://okwave.jp/qa3205563.html)で一定の解決を見たのですが、新たな問題が発生してしまったので教えてください。 sample.htmlへの記述 <script type="text/javascript"> var ref = document.referrer ; document.write("<script type=\"text/javascript\" src=\"​http://hoge.com.info.php?ref="+ref+"​\"></script>"); </script> で、refを送信したのですが、 受け取ったrefが、googleだと、 「http://www.google.co.jp/search?hl=ja」になってしまい、&で区切られている以降のデータ(つまり「q」)が取得できません。 別質問(http://okwave.jp/qa3200959.html)で、 hrm_mmmさんの回答======================================= $_SERVER['HTTP_REFERER']が対象ならば、以下で、$query_hashに、$_GETと同様のurldecode済みデータがハッシュ配列として得られます。 $url_hash = parse_url( $_SERVER['HTTP_REFERER'] ); if( array_key_exists( 'query', $url_hash ) and strlen($url_hash['query'])>0 ){ parse_str( $url_hash['query'], $query_hash); } // あとは、$url_hash['host'] によって切り分けて検索キー取り出しをすればよいと思います。 $word = ''; if( preg_match ("/\.google\./", $url_hash['host']) ) { $word = $query_hash['q']; } elseif( preg_match ("/\.yahoo\./", $url_hash['host']) ) { $word = $query_hash['p']; } elseif( preg_match ("/\.goo\.ne\.jp/", $url_hash['host']) ) { $word = $query_hash['MT']; } ====================ここまで============================ こんなんでやればいいよ。と教えていただいたのですが、グーグルから送られたref自体にqが入っていません。 というか、?以降の1番目のクエリーしか入ってきません。 ヤフーなら ?p=~でOK gooなら ?MT=~でOK google は hl=jaが一番最初にくるので、qがとれません。 なぜ、送信されてくるreferrerに2番目以降のパラメータがついてこないのでしょうか。。。 ちなみにsample.htmlで document.write(document.referrer)をやるとちゃんと全て表示されます。

  • バッチファイルの日付を自動化したい

    下の様なバッチファイルの日付を6日16日26日のとき set du=20071001 のduを変数?にして書き換えたいのですが 良きアドバイスをお願い致します。 OS WindowsXp @echo off set du=20071001 :rem ***** 日付入力 ***** set yy=%du:~0,4% set mm=%du:~4,2% set dd=%du:~6,2% set tt=%yy%%mm%%dd% set tu=%mm%-%dd%-%yy% set dir1=C:\Documents and Settings\Owner\My Documents set dir2=d:\backup\ xcopy "%dir1%" "%dir2%%tt%" /i/s/v/y/d:%tu%

  • Apache2でSetEnvが動作しない。

    お世話になります。 Aapche2でCGIの環境変数をセットしたく、 SetEnvを設定したのですが、$ENV{''}で確認しても表示されません。 httpd.conf内の場所を変えて記述してみたり、 .htaccessに記述してみたりしても、いっこうに反映されません。 これは、なにか原因となりうるものはありますでしょうか。 よろしくお願いいたします。 ・記述行 SetEnv PERL5LIB "/usr/local/lib/perl" Apache 2.0.58 FedoraCore 4 perl 5.8.6

    • ベストアンサー
    • CGI
  • bashシェルスクリプトで変数を使う

    bashシェルスクリプト内で変数を使いたいです。 Linux内の設定ファイルを参考に、 ・変数名=その内容、で設定 ・${変数名} 、で呼び出す だと判断し、以下のように使っています。 #!/bin/bash WORK=/home/aaa/ cd ${WORK} その後検索したところ、 「呼び出すには、$変数名 のように記述する」との説明を見かけ、 実際$の後に変数名を付けるだけでも認識したのですが、 { }は付けても付けなくてもよいのでしょうか。 { }が必要な場合もあるのでしょうか。

  • Javaのコードが組み込まれたJavaScriptの記述について

    質問です。 以下のソースをJavaScriptのみで実装したい場合、 var val; opener.document.form.str<%= Bean.getNum() %>.value = val[0]; まず、変数に以下のように格納したあと、 opener.document.form~はどのような記述になるのでしょうか? var num = '<%= Bean.getNum() %>'; // 変数に格納 宜しくお願いします。

専門家に質問してみよう