Rubyにおける変数の使い方と注意点

このQ&Aのポイント
  • Windows2000上でRubyを動かしていますが、変数にファイル名を代入して実行すると動かなくなりました。system関数を実名で呼び出す場合は動作しますが、変数に代入した場合は動作しません。
  • Rubyのスクリプトでは、ディレクトリを移動して現在の作業ディレクトリを取得し、指定したディレクトリ内のファイル名を取得して処理しています。
  • 変数に代入したファイル名を使用してtar.gzファイルを展開するために、system関数でコマンドを実行していますが、変数が展開されずにそのまま渡されているため、正しく動作しません。
回答を見る
  • ベストアンサー

Rubyにおける変数

Windows2000上で、Rubyを動かしています。 皆様のお陰で、少しずつ進んでおります。しかし、また質問させてください。 変数に、ファイル名を代入して、実行すると、動かなくなりました。 実名を入れた、system('tar zxf test_20070511.tar.gz')では、動きますが、 変数にした、system('tar zxf myFilename')では、動きません。 Rubyスクリプト ---------------------- print Dir.getwd,"\n" Dir.chdir('C:\myData\myData2') print Dir.getwd,"\n" dir = Dir.open('C:\myData\myData2') while myFilename=dir.read do if /.tar.gz/i =~myFilename then puts myFilename system('tar zxf myFilename') end end dir.close ------------------------------------ 宜しくお願いいたします。

noname#95859
noname#95859

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

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

何ぞ「入門書」を買って読んだ方がよろしかろう。 system("tar zxf #{myFileName}") と変数を展開して下さい。 それから Dir.foreach(path) { |file| ... } を使いましょう。サンプルのコーディングだと例外が発生した場合にディレクトリがクローズされません。

noname#95859
質問者

お礼

koko_u_さん、手取り、足取り、教えていただきまして、 本当にありがとうございます。本を買ってきて、勉強していきます。 おかげさまで、本件は、うまく行きました。

関連するQ&A

  • Rubyのスクリプト

    つぎのようなスクリプトを組みました。これはこれで、動いておりますが、お願いです。 (1)Rubyらしい書き方にするには、どこを改めればよいですか? (2)ref_file=open("myReference.txt") の部分は、 外部のレファレンスを用いて名前を翻訳しているところです。 この部分を、関数呼び出しでやってしまいたい。どのように組みなおせば良いですか? 宜しくお願いいたします。 --------------------- おおまかな説明:ディレクトリ「myData」の中にあるlogファイルをひとつずつオープン。 まず、「Target」という単語を探し、その直後にある単語を掴んで、外部のレファレンスファイル「myReference.txt」からrealNameを持ってくる。 その後、処理-----を実行する。 myPath='C:\myData\' print Dir.getwd,"\n" Dir.chdir(myPath) Dir.foreach(myPath) { |myFileName| if /.log/i =~myFileName file_source_body=open(myFileName, "r") while text=file_source_body.gets do if(/Target (\w+\/)/=~text) then myTargetName=$1 ref_file=open("myReference.txt") # (2)のアイテムの部分 while ref_info=ref_file.gets do (/#{myTargetName}\s(\S+)/i=~ref_info) && (realName=$1) end ref_file.close end end ------- ------- ------- }

  • Rubyのスクリプト

    Rubyを使って、ディレクトリを順に処理していくスクリプトを作ろうとしています。 下記は、perlのものです。 chdir("C:/data"); opendir(DIR, "./"); @myfolderlist= grep(-d, readdir(DIR)); close(DIR); foreach $myfolder(@myfolderlist){ if(($myfolder ne ".") && ($myfolder ne ".." )){ print "$myfolder\n"; } } これに対応するような、かつRubyらしい(foreachを使う)スクリプトを作りたいと考えます。 Dir.foreach('C:/Data'){|item| item.chomp! print item,"\n" } 上記のRubyスクリプトの問題は、ディレクトリのみならず、そこに存在するファイルまで出してしまいます。 Rubyにおいて、ディレクトリ」のみを持ってくるには、どのようにすれば良いでしょうか? 宜しくお願いいたします。

  •  rubyをMacOSXへインストールできません

    ruby-1.6.6.tar.gzをMacOSX 10.1.2へインストールしょうとして、 # cd home # tar zxf ruby-1.6.6.tar.gz # cd ruby-1.6.6 # ./configure --enable-shared # make ; make test makeで、次のエラーがでます。  make: ***No targets specified and no makefile found. Stop. で、man make で確認すると、  man: no entry for make in the manual. と出てしまいます。  これは、makeがないということでしょうか。それとも、MacOSXのインストールに失敗しているのでしょうか。  どなたか、お願いします。

  • Rubyについての質問です

    Rubyでちょっとわからないことがあって、マニュアルを見ても解決しなかったので、こちらに質問しました。 たとえば a = 10 puts "Answer" puts a というソースがあったとして、これを実行すると Answer 10 と出力されます。 ここで質問なんですが、aという変数を用いて Answer = 10 のように出力するにはどうしたらいいのでしょうか? たとえばJavaだったら int a=10; system.out.print("Answer" + a); と同じような出力結果にしたいんです。

  • 検索対象を変数に与えてマッチング

    Rubyの初心者です。次のサンプルがマッチングできない、 書き方を教えてくださいませんか。 #!/usr/bin/env ruby key = "キーワード" while gets $_.chomp! puts $_ if $_ =~ /"#{key}"/ end puts 文を puts $_ if $_ =~ /キーワード/ に書き買えば、検索はできますが、変数に与えてマッチング することはできないでしょうか。 ご教示を宜しくお願いします。

    • ベストアンサー
    • Ruby
  • Ruby初心者です。

    以下の練習問題をやっているのですが、どうもうまくいきません。 (1)担当名が"end"になる迄、担当名と売上を入力する。 (2)売上合計を求める。 (3)各担当の売上が売上合計の何%になるかの比率の計算を行う。 (4)担当名、売上、比率を表示する。 どこがいけないのがご教授頂けますでしょうか。 よろしくお願い致します。 *********************************** #! ruby -E Windows-31J:utf-8 # coding: utf-8 kensu = 0 uriage = 0 goukei = 0 uriage_t = [20] tanto = [10] tanto = [20][10] puts("担当名がendで終了") print(kensu = kensu + 1, "人目の担当名は") tanto = $stdin.gets.chomp! tanto.gsub!("\n", "") print("売上") uriage = $stdin.gets.chomp!.to_i while tanto != "end" kensu = kensu goukei = goukei + uriage uriage_t = uriage tanto_t = tanto print(kensu = kensu + 1, "人目の担当名は") tanto = $stdin.gets.chomp! tanto.gsub!("\n", "") if tanto != "end" print("売上") uriage = $stdin.gets.chomp!.to_i end end kensu = kensu + 1 goukei = goukei + uriage uriage_t = uriage tanto_t = tanto, "合計" puts "________________________________________" puts "  担当      売上  比率  " puts "________________________________________" for i in kensu kensu += i ritu = uriage * 100 / goukei puts "担当名は#{tanto} 売上は#{uriage_t}円 比率は#{ritu}%" end

  • Ruby:net/httpライブラリで質問です。

    RubyでWEBAPIをたたこうとおもい リファレンスから require 'net/http' Net::HTTP.version_1_2 # おまじない Net::HTTP.start('www.example.com', 80) {|http| response = http.get('/index.html') puts response.body } という記述を利用してヤフーのページを取得しようと 動かしたところまったく動作しなかったのでだめもとで例外をとってみたら begin Net::HTTP.version_1_2() # おまじない Net::HTTP.start("http://yahoo.co.jp", 80) {|http| response = http.get("/index.html"); puts response.body } rescue => ex print ex.class; print "<hr />"; print ex.message; print "<hr />"; print ex.backtrace; end SocketErrorgetaddrinfo: 記憶域制御ブロックが壊れています。 C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `initialize'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `open'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `connect'C:/ruby/lib/ruby/1.8/timeout.rb:53:in `timeout'C:/ruby/lib/ruby/1.8/timeout.rb:101:in `timeout'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `connect'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:553:in `do_start'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:542:in `start'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:440:in `start'C:/Apache/htdocs/tokui12.rb:11 上記のような例外が取れました。 これは、Rubyの際インストールが必要なのでしょうか? リファレンスまんまを利用しているので記述間違いとかはないと思うのですが・・・ システム的な問題?と思いPHPでたたいたところ PHPであれば普通にAPIはたたけました。 対処策はどうしたらいいのでしょうか?

    • ベストアンサー
    • Ruby
  • rubyの構文(&&を用いた条件分岐について)

    ruby初心者です。 最近、ruby on railsで書かれたソースを引き継ぎ解析を行っています。 その中で、以下のような構文が出てきました。 ========================================= num = 0 bool = false vals = '' puts 'start' num == 0 && bool && if vals  puts 'true' else  puts 'false' end puts 'end' ========================================= 上記プログラムを実行すると、if ~ end までが実行されませんでした。 そこで、変数boolをtrueに変更して再実行したところ、if文が実行されました。 そこで私は、上記プログラムは以下と同値であると解釈しました。 ====================================== (省略) if num == 0 && bool  if vals   puts 'true'  else   puts 'false'  end end ======================================= 以上を踏まえて・・・ 1.私の解釈は正しいでしょうか? 2.間違っている場合、正しい処理の解釈を教えていただけますでしょうか?または参考URLを教えていただけますと助かります。 文の最後に"&&"がついている文を見たことがなく、ネットで調べても 正解らしいものが掲載されていなかったので質問させていただきました。 拙い説明で申し訳ありませんが、よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • Rubyの構文?言語仕様?

    Rubyの以下コードについて質問です。 #!/ruby/bin/ruby print "content-type: text/html\r\n\r\n"; puts "Hello World!" begin def foo x =0 (0...10).each do |value| print value.to_s +"の時"+ x.to_s + "<br />" end end foo rescue =>e print e.class.to_s+ "<br />" print e.message end 上記コードを実行すると以下のような例外を取得します NoMethodError undefined method `+@' for "\343\201\256\346\231\202":String どうやら上記コードの print value.to_s +"の時" の部分の  +"の時" という箇所が問題のようなのですが 上記箇所を + "の時" のように 文字列連結子の +と "の間に半角スペースを 入れるとうまく実行されます。 いったい原因はなんなのでしょうか? 細かい箇所ですが是非、ご教授ください。

    • ベストアンサー
    • Ruby
  • JavaScriptの変数にCGIの出力を入れたい。

    呼ばれると文字"a"を出力するhttp://xxx/ret_a.cgiがあるとします。 JavaScriptの中で変数hogeに、このhttp://xxx/ret_a.cgiの出力を格納するにはどうしたらよいですか? http://xxx/ret_a.cgiの内容は以下のようなかんじです。 ------------------- ここから ------------------- #!/usr/local/bin/ruby puts "Content-Type:text/html\n\n" puts "<html>\n" puts "<head><title>test1</title></head>\n" puts "<body>\n" puts "a" puts "</body></html>\n" ------------------- ここまで ------------------- puts "a"だけだと、500 Internal Server Errorになってしまうので、 上記のようにしました。

専門家に質問してみよう