トップページ⇒tech
1001コメント373KB

Ruby 初心者スレッド Part 50

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/07/29(日) 14:26:28.92
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。
質問するときは、OSやRubyのバージョン、エラーメッセージを書いたほうがいいお
RoRはスレ違いよ

前スレ
Ruby 初心者スレッド Part 49
http://toro.2ch.net/test/read.cgi/tech/1336507487/

るりまサーチ (リファレンス検索)
http://rurema.clear-code.com/

Rubyist Magazine - るびま
http://jp.rubyist.net/magazine/

逆引きRuby
http://www.namaraii.com/rubytips/
07567432012/12/10(月) 17:48:00.07
色々とありがとうございます
0757デフォルトの名無しさん2012/12/12(水) 08:50:03.28
ものすごく基本的なことなのかもしれませんが
この処理ができるならやって、できないならスルー
ってどう書けばよいでしょうかw

具体的には複数のテキスト内を順番にサーチしていき
ある文字列があるならそれを取り出し、なければなにもしないという処理をしたいです

if サーチした結果 = nil
 p 1
else
 p 2
end にしたら全部2になるし

if サーチした結果 = ""
にしたら全部1になるしで判別できません
0758デフォルトの名無しさん2012/12/12(水) 11:05:20.51
=は代入
==が比較

if サーチした結果 == nil
とする。

あるいは
if サーチした結果.nil?
とか
if !サーチした結果
とか
unless サーチした結果
とする。
0759デフォルトの名無しさん2012/12/12(水) 11:48:48.85
>>757
書いてみたコードを晒したら、アドバイスしやすい。
0760デフォルトの名無しさん2012/12/12(水) 11:58:04.85
ありがとうございます
返ってくる値がnilじゃなくて""だったので
h = サーチした結果
unless h == ""
 テキストとってくる
end
これでうまくいきそうです
0761デフォルトの名無しさん2012/12/13(木) 00:10:06.22
なんで!が有るのにunlessも有るんですか?
if conditionとunless !conditionって同じですよね?
unlessを使うと、
・タイプ数が多くなる
・手続き中に正常系と異常系が混在して頭の切り替えコストが増える
・二重否定が可能
なんだけどメリット有るんですか?
0762デフォルトの名無しさん2012/12/13(木) 00:13:32.90
Perlから引き継いだ以上の意味はないんじゃない?
0763デフォルトの名無しさん2012/12/13(木) 00:18:15.21
強いてあげるなら、

* 後置するとブロークンイングリッシュとして読みやすくなる場合がある。
* if !condition だと ! を見落としやすい (if ! condition のように間を開けて見やすくする流儀もある)。

尚、unless には else 節を付けないほうがいい。
それこそ二重否定でわかりづらくなる。
0764デフォルトの名無しさん2012/12/13(木) 00:25:15.57
!を見落とすって経験上ないなぁ
なんかJavaとかでifに常に{}書けという主張とやや似てる
0765デフォルトの名無しさん2012/12/13(木) 00:34:01.73
perlintro(1)には

> This is provided as a more readable version of "if (!condition)".

とだけ。
0766デフォルトの名無しさん2012/12/13(木) 00:44:13.43
>>765
同意できないw
0767デフォルトの名無しさん2012/12/13(木) 01:18:12.72
[1,2,3].each_with_index do |e, i|
 puts "#{i+1} / #{SIZE_OF_ARRAY}"
end

とかしたいだんけどSIZE_OF_ARRAYを表す組み込み変数とか無いの?

array = [1,2,3]
array.each_with_index do |e, i|
 puts "#{i+1} / #{array.size}"
end
だと変数への代入が増えて何かダサイ
0768デフォルトの名無しさん2012/12/13(木) 01:20:29.82
なぜイレテータのローカルスコープにselfちゃんが居ないのか…
0769デフォルトの名無しさん2012/12/13(木) 01:24:16.83
[1,2,3].tap {|array| array.each_with_index {...} }

# 全然解決になってない:)
0770デフォルトの名無しさん2012/12/13(木) 01:33:08.50
>>766
おまえのような雑魚が同意できなかったところで誰も困らない
Larryが使いやすければ、それでいい
0771デフォルトの名無しさん2012/12/13(木) 01:51:26.84
class Enumerator
def with_size(&blk)
return to_enum(:with_size) unless blk

ary = to_a
size = ary.size
ary.each{|args|
blk[*args, size]
}
end
end

%w(a b c).each_with_index.with_size{|s,i,n|
p [s,i,n]
}
0772デフォルトの名無しさん2012/12/13(木) 23:29:31.42
どなたか教えてください!
rubyでプログラムを実行し、表示させた結果をメモしないままターミナルを閉じてしまいました。
表示履歴を見る方法はありますか?
0773デフォルトの名無しさん2012/12/13(木) 23:34:34.31
ターミナルがログを保存する設定にでもなってない限り方法は無い
入力したコマンドラインの履歴でよければ$HOME/.bash_historyとかに入ってる可能性があるけど
0774デフォルトの名無しさん2012/12/13(木) 23:42:24.44
レスありがとうございます。
コマンドラインじゃなくて、コマンドラインで実行させた結果が知りたいです。
詳しい人に初期設定してもらったので、ひょっとしたらログを保存する設定になっているかもしれません。
その場合、どう入力したらいいかご存知でしょうか?
ググってもググってもよくわからないんです・・・!
0775デフォルトの名無しさん2012/12/13(木) 23:48:34.19
以前、なにかの拍子に全履歴がのってるファイルを開いて、
「ほー」と思った記憶があるんだけど幻だったのかな・・・
0776デフォルトの名無しさん2012/12/13(木) 23:52:28.56
>>774
その詳しい人に聞いたらいいじゃないか
ちなみにターミナルっていっても色々あるけどmacの場合はこんなのが出てきた
http://at-fog-of-index.blog.so-net.ne.jp/2010-12-24
0777デフォルトの名無しさん2012/12/14(金) 00:10:35.36
>>776
その詳しい人はある日出社しなくなったまま行方不明になってしまったのでなんとも・・・

今後はちゃんと保存しておくよう、教えていただいた方法で設定しておきますね、ありがとうございます。
今回はもう諦めて上司に土下座することにします。

これを機にいろいろとrubyを勉強しよう、そうしよう・・・
0778デフォルトの名無しさん2012/12/14(金) 00:17:36.01
last
0779デフォルトの名無しさん2012/12/14(金) 00:18:50.85
Ruby/Tkってどう?
0780デフォルトの名無しさん2012/12/14(金) 01:03:06.56
rakeの引数がキモすぎるな…
これならシェルの引数をそのまま渡した方がまだましだわ。
0781デフォルトの名無しさん2012/12/14(金) 01:08:53.91
「rake 引数 きもい」でググると結構でてくるな。
0782デフォルトの名無しさん2012/12/14(金) 01:11:01.80
argsの挙動がキモいな。
なんかC臭さの残る仕様だわ。
0783デフォルトの名無しさん2012/12/14(金) 01:33:04.23
現状環境変数使うのが正解だな。
railsのrakeもそうなってるしな。
0784デフォルトの名無しさん2012/12/14(金) 02:17:12.12
自分で作った例外クラスをスロー&キャッチする時に、再利用性がなく、その処理内だけで使うような例外クラスで、わざわざ大げさにclass Hogeとか定義するまでもないような場合に、ちょろっとその場で定義して使うような機能はないんですかね?

↓おおげさ
class HogeException < Exception
end
begin
 raise HogeException.new
rescue HogeException
 puts "うわー"
end

↓こんな感じで書きたい
begin
 raise :hoge if hoge
 raise :fuga if fuga
rescue :hoge
 puts "うわー"
rescue :fuga
 puts "ぬわー"
end
0785デフォルトの名無しさん2012/12/14(金) 02:17:53.00
ラベル付き汎用例外、みたいな
0786デフォルトの名無しさん2012/12/14(金) 04:58:42.95
>>784
Rubyにおける例外クラス定義とraiseとrescueはおおげさでもなんでもない
Javaのように管理しようとすると破綻するぞ
0787デフォルトの名無しさん2012/12/14(金) 07:54:51.75
濫用するとかっこわるいぞ、みたいなことは言われてるがな
アプリケーションエラー以外の例外クラス名を思いつかなくて事前にifで避けられるならifで避けたほうがマシ
0788デフォルトの名無しさん2012/12/14(金) 10:54:38.25
>スロー&キャッチ
case exp =
catch(:exp) do
throw(:exp,:hoge) if hoge
throw(:exp,:fuga) if fuga
end
when :hoge then puts 'うわー'
when :fuga then puts 'ぬわー'
end
0789デフォルトの名無しさん2012/12/14(金) 10:56:32.73
>>788
(´・ω・`)…
0790デフォルトの名無しさん2012/12/14(金) 19:31:55.86
メッセージで分岐すれば

flag='うわー'

begin
raise 'うわー' if flag=='うわー'
raise 'ぬわー' if flag=='ぬわー'
rescue Exception => ex
case ex.message
when 'うわー'
puts ex.message
when 'ぬわー'
puts ex.message
end
end
0791デフォルトの名無しさん2012/12/14(金) 19:36:33.22
>>790
最早なんのためになにを避けてたんだかわからなくなってるな
0792デフォルトの名無しさん2012/12/14(金) 20:14:27.84
>>784
> ↓こんな感じで書きたい
> begin
>  raise :hoge if hoge
>  raise :fuga if fuga
> rescue :hoge
>  puts "うわー"
> rescue :fuga
>  puts "ぬわー"
> end

元がコレだからな
なんで例外使いたいんだか
0793デフォルトの名無しさん2012/12/14(金) 20:26:11.93
気を遣って単純な例示にしようとしたら「これならそもそもいらないんじゃね??」みたいな反応を返される悲しい例
0794デフォルトの名無しさん2012/12/14(金) 22:53:54.04
gotoが有れば解決
0795デフォルトの名無しさん2012/12/14(金) 23:03:50.62
class SymbolException < Exception
 attr_reader :sym
 def initialize(sym)
  @sym = sym
 end
end

class Symbol
 alias old_match ===
 def ===(obj)
  return old_match(obj) unless SymbolException === obj
  obj.sym == self
 end
end

def raise(*args)
 Kernel.raise *args unless args.length == 1 && Symbol === args[0]
 raise SymbolException.new(args[0])
end



begin
 raise :hoge
rescue :fuga
 p "fuga"
rescue :hoge
 p "hoge"
end

こんなの実装できるとかRuby変態だろ…
0796デフォルトの名無しさん2012/12/15(土) 00:57:15.80
>>795
>こんなの実装できるとかRuby変態だろ…

偽装Lispだからな。
0797デフォルトの名無しさん2012/12/15(土) 01:02:50.15
おまいらの会話、高度過ぎて付いていけない。
おまいらなら、余裕でRuby GOLDが取れそうだな。
0798デフォルトの名無しさん2012/12/15(土) 02:12:28.77
sendメソッド使いまくるソースが嫌い
なんでもかんでも重複を省こうとする
アホちゃうかと
読みやすさ、メンテのしやすさ、手間、バランスを考えろ
0799デフォルトの名無しさん2012/12/15(土) 02:32:23.51
再利用するってことは、依存が増えるってことだからな。
そこが分かってない。
0800デフォルトの名無しさん2012/12/15(土) 05:33:45.21
Rubyって
def doya
 if a == 1# えー
 || b =~ /hoge/ # びー
 || c !~ /moge/ # しー
 || d.empty? # でー
 || !e.nil? # いー
 then
  puts "わーい"
 else
  puts "ぐはあ"
 end
end
とか書けないんだ。
0801デフォルトの名無しさん2012/12/15(土) 05:35:48.83
↓だと各条件にコメントが書けない
一行で書けるブロックコメントも無いしなぁ
def doya_sub
 if a == 1 || b =~ /hoge/ || c !~ /moge/ || if d.empty? || !e.nil?
  puts "わーい"
 else
  puts "ぐはあ"
 end
end

じゃあ↓こうする?
こりゃりたーんりたーん五月蝿いなぁw
def doya
 puts doya_sab ? "わーい" : "ぐはあ"
end

def doya_sub
 return true if a == 1# えー
 return true if b =~ /hoge/ # びー
 return true if c !~ /moge/ # しー
 return true if d.empty? # でー
 return true if !e.nil? # いー
 return false
end
0802デフォルトの名無しさん2012/12/15(土) 07:13:54.44
>>800
はい、Ruby的には判断できませぬ
インデントとか揃わなくてかっこ悪いとたいへん不評なのですが

if
cond1 || # when 1
cond2 || # when 2
cond3 # when 3
then
のようにorを後ろに書いてくだされ
0803デフォルトの名無しさん2012/12/15(土) 07:25:33.12
あ、ifで改行しちゃった

if cond1 || # when 1
cond2 || # when 2
cond3 # when 3
then
0804デフォルトの名無しさん2012/12/15(土) 19:21:50.57
rubyのbegin-endが嫌いで{}に変われば良いのにって思ってたけれど、
groovyと比較するとbegin-endの方が目に優しいね
0805デフォルトの名無しさん2012/12/16(日) 01:30:47.96
わざとレトロなトークンを使うことで
記号含有率を下げると同時に、`波括弧を目立ちやすくする
という設計意図があるらしい
0806デフォルトの名無しさん2012/12/16(日) 04:28:35.10
文句のほとんどがifの部分で、文句の本質は「俺の知ってるCと違う」なので、礼儀正しく無視されてきたという経緯はないでもない
トークンとして長くて大きくて実質"予約語"として命名余地を圧迫してることは否定しないが、使用中の見易さそのものは大差ねえよ
0807デフォルトの名無しさん2012/12/16(日) 04:32:17.38
インデントがひどいと{}のほうがbegin-endよりまともに読めそうだけどまともにインデントすればいい話か
0808デフォルトの名無しさん2012/12/16(日) 08:49:25.76
rubyのbegin-endは、Javaのtry〜、であって、{} じゃないぞ。
0809デフォルトの名無しさん2012/12/16(日) 12:49:58.30
rvmで1.8系と1.9系といくつかのバージョンをインストールしてみたんですが
スクリプトから特定のバージョンを指定で実行するようにしたい時は
#!/Users/username/.rvm/rubies/ruby-1.9.2-p290/bin/ruby
とかしないといけないんでしょうか。

これだとバージョンを上げるとスクリプトを修正しないといけないので、
#!/Users/username/.rvm/rubies/ruby-1.9
とかで指定できて、rvmで自動的に最新の1.9系へのシンボリックリンクがはられる、
みたいのができると便利だと思うんですけどできないですか?
0810デフォルトの名無しさん2012/12/16(日) 13:24:54.53
>>809
rvm に 1.9系の最新 みたいな概念はないんじゃない?
0811デフォルトの名無しさん2012/12/17(月) 04:53:24.51
Ruby1.9.3です
定数のように値を後で変更できない配列やhashを作成することはできませんか?
0812デフォルトの名無しさん2012/12/17(月) 05:28:33.09
irb> a = [1,2]
irb> a.freeze
irb> a << 3
RuntimeError: can't modify frozen array
irb> p a
[1, 2]

ただ、実際のところはそれほど強制的な効果はなく、わりと嫌われてもいる
ユーザーに値を変更して欲しくないのなら、マニュアルにそう書くか、そもそも自己責任で放置するほうがよい
0813デフォルトの名無しさん2012/12/17(月) 06:04:06.74
Rubyではクラスやメソッドやデータ構造を他人が変更しうるのは「当たり前」で、
変更したらうまく動作しない可能性があるのも「当たり前」
「これを外部から変更されたらプログラムが誤動作するので変更を禁止したい」
とか過保護または過敏に考える必要はない
0814デフォルトの名無しさん2012/12/17(月) 06:57:23.26
禁止したいときはドキュメントに書く
0815デフォルトの名無しさん2012/12/17(月) 06:59:51.34
Refinementsが入れば改善されるんじゃないの?
0816デフォルトの名無しさん2012/12/18(火) 00:14:43.70
酷い知ったかを見た
Railsのソース見てもfreezeぐらいたくさん出てくるのに。
0817デフォルトの名無しさん2012/12/18(火) 04:35:32.86
私は宝石を作っている。私はSTDLIBにだ "multi_json"依存関係の代わりに "json"を使うべきでしょうか?
0818デフォルトの名無しさん2012/12/18(火) 11:15:16.40
>>811
こういうのじゃダメなの?
class << FOO=Object.new
def bar
1
end
def baz
2
end
end
0819デフォルトの名無しさん2012/12/18(火) 19:37:56.04
自分の用途ではfreezeでよさそうです、ありがとうございました
0820デフォルトの名無しさん2012/12/19(水) 11:32:58.13
ここを参考にしてttp://qiita.com/items/348195ef6f797af08010

class Counter < BasicObject
 def initialize
  @count = 0
 end
 def plus(n)
  @count += n
 end
 def method_missing(*a)
  @count.send(*a)
 end
end

みたいな感じのクラスを作って思い通りの動作は得られたのですが、
インスタンスの.classがFixnumになってしまうのがどうにも・・・
他にうまい実装方法ありませんかね?
0821デフォルトの名無しさん2012/12/19(水) 12:17:38.57
ところで、対応するのは class メソッドだけでいいの?
ancestorsは? kind_of? は? instance_methods で plus が出ないけどいい?

ということで選んで移譲するのがいいように思う
てゆーか Object や Module のメソッドを使いたいなら BasicObject の直接継承なんてやってはいかんぜよ
0822デフォルトの名無しさん2012/12/19(水) 12:59:51.22
実際問題としてやりたいのは

class Counter
 attr_reader :count
 def initialize
  @count = 0
 end
 def plus(n)
  @count += n
 end
end

こういうクラスがあったとして
counter = Counter.new
counter.count #こうじゃなくてcounter単体で@countの値を得たい

つまり.countを省略したいと言うだけのことなのです
委譲を使って下記のようにも書けたのですが・・・そういうことではないんですかね?

class Counter < DelegateClass(Integer)
 def initialize
  super 0
 end
 def plus(n)
  __setobj__ self + n
 end
end
0823デフォルトの名無しさん2012/12/19(水) 21:58:40.90
便乗して質問になるんですが
pでの表示はinspectとか、文字列に埋め込んだりするとto_sとかが呼び出されて変換されますが
足し算などでは勝手に何かメソッドを呼んでくれたりはしないんでしょうか?
0824デフォルトの名無しさん2012/12/19(水) 23:57:44.76
足し算に使うと整数100のように振る舞うクラス。

class C
# C.new + 10 #=> 110
def +(other) 100 + other end
# 10 + C.enw #=> 110
def coerce(n) [n,100] end
end
08258232012/12/20(木) 01:35:31.25
>>824
なるほどcoerceというのが呼ばれるんですね
ありがとうございました
0826デフォルトの名無しさん2012/12/20(木) 22:53:23.66
分散並列処理フレームワークありませんか?
0827デフォルトの名無しさん2012/12/21(金) 01:29:03.32
しょうもない質問で申し訳ないのですが、スクレイピング出来るコードをサーバー上に起きました。

ruby ファイル名.rb で必要な情報一覧はLinuxコンソール上から叩くと取得出来ています。

これをブラウザ上にテキスト形式でどの様に表示させればいいのか解らず、sinatraと言うフレームワークもためしましたが上手く行かず、、、

多分凄い簡単な気もするのですが全くわかりません。

テキストにしたいと言う理由は実行結果をjson形式の書式に無理やり変えている為です。require jsonは利用してません。DBは利用してません。

プログラミング自体初心者です。。
0828デフォルトの名無しさん2012/12/21(金) 02:14:25.80
君は日本語も初心者のようだね
0829デフォルトの名無しさん2012/12/21(金) 02:17:30.67
>>827
とりあえず、ここを嫁。
http://www.sinatrarb.com/intro-jp.html
んでhttp://localhost:4567をWebブラウザでアクセスしてうまくいってそうなら、
次は、↓みたいにparamsってHashの変数を使うように書き換えて再起動して、

# myapp.rb
require 'sinatra'
get '/' do
 return '嫁は' + params[:yome] + '妹' + params[:imouto]
end

↓でアクセスして引数が参照できたら、
http://localhost:4567/?yome=morisama&;imouto=rikka

あとは好きにいじって行け。
あとHTTPの勉強が少し要ると思う。
0830デフォルトの名無しさん2012/12/21(金) 02:24:11.23
>>829
有り難うございます。

:4567で起動はしてるのですが、Linuxのコンソール上には結果は出ていてエラーもありません。

ですがブラウザは真っ白な状態になっていてソースを表示しても何も入ってないと言う感じです。

スクリプトの結果をコンソールと同じ様にしたいだけなのにそれがどうしても出来ません。
0831デフォルトの名無しさん2012/12/21(金) 02:30:02.59
>>829

ちなみにコードは

get '/' do

ここにまるごと張り付けてます。

end

ハッシュを利用しないといけないのであればなぜそうなのかが公式見ても理解出来ません。。。
0832デフォルトの名無しさん2012/12/21(金) 02:47:36.88
クラスタマシン使った方が安上がりになりそうなことまで、hadoopつかってる企業とかありそう
0833デフォルトの名無しさん2012/12/21(金) 02:56:23.28
>>831
コンソールへの出力にputsとか使ってるんだろう?
putsは引数の文字列をlinuxコンソールに出力するメソッド(本当は違うけど)
今現在コンソールに出力されてる文字列をブラウザに送るにはどうすればいいかは
829に書いてくれてあるのをみればわかるだろわかるよなわかってくれよそんくらい
0834デフォルトの名無しさん2012/12/21(金) 03:26:47.76
>>831
get '/' do

 return "森夏ちゃんエロい"
end

とかいて、表示したいもんを文字列にしてreturnで返せ。
そうしたらブラウザで
http://localhost:4567/
にアクセスすると"森夏ちゃんエロい"が表示されるんだよ。
0835デフォルトの名無しさん2012/12/21(金) 03:51:48.91
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘
0836デフォルトの名無しさん2012/12/22(土) 14:51:40.51
gs = TCPServer.new(12345)
s = gs.accept()
s.puts("あ")
でクライアントに"あ"が送信されますが送信文に改行\nを加えるとそこで送信文が終わってしまします
つまりs.puts("あ\nい")とするとクライアントは"あ"しか受信してくれません
なんとかなりませんか
0837デフォルトの名無しさん2012/12/22(土) 14:58:50.35
getsは1行読み込むんだから、putsで改行1つ入れたらそりゃ2回gets呼ばんといかんだろう。
http://doc.ruby-lang.org/ja/1.9.3/method/IO/i/gets.html
0838デフォルトの名無しさん2012/12/23(日) 00:52:07.77
windowsコマンドプロンプトirbで無限ループに入るとCtrl+C押しても止まりませんよね
皆さんどうしていますか
0839デフォルトの名無しさん2012/12/23(日) 01:41:22.82
いままで見たことない
exit も打てなくて C-c も使えないということ?

じゃ、GUIのタスクマネージャから終了させる
コマンドラインだったら、別の DOS プロンプトから tasklist で
実行時期が早めの DOSプロンプト(cmd.exe)の pid を調べて kill する
0840デフォルトの名無しさん2012/12/23(日) 08:32:59.15
>実行時期が早めの DOSプロンプト(cmd.exe)の pid を調べて kill する

嘘を教えるな
irb.exe もしくは ruby.exe の pid を調べて kill する
08418392012/12/24(月) 00:28:12.80
素で間違えてしまった
フォローありがとう
0842デフォルトの名無しさん2012/12/28(金) 11:02:17.08
require 'net/smtp'
してrubyでメールを送ることに成功したのですが、宛先がgmailのときだけ
/usr/lib/ruby/1.8/net/smtp.rb:942:in `check_response': 553 5.7.1 <[email protected]>... Relay operation rejected (Net::SMTPFatalError)
from /usr/lib/ruby/1.8/net/smtp.rb:911:in `getok'
from /usr/lib/ruby/1.8/net/smtp.rb:854:in `rcptto'
from /usr/lib/ruby/1.8/net/smtp.rb:835:in `rcptto_list'
from /usr/lib/ruby/1.8/net/smtp.rb:833:in `each'
from /usr/lib/ruby/1.8/net/smtp.rb:833:in `rcptto_list'
from /usr/lib/ruby/1.8/net/smtp.rb:654:in `sendmail'
from ./mailtest.rb:26:in `sendmail'
from /usr/lib/ruby/1.8/net/smtp.rb:526:in `start'
from /usr/lib/ruby/1.8/net/smtp.rb:463:in `start'
from ./mailtest.rb:25:in `sendmail'
from ./mailtest.rb:68
となって失敗してしまいます。対処法をご存知のかたは教えて下さい。
08438422012/12/28(金) 11:51:38.09
すみません
smtpの認証パラメータを設定していなかったのが原因でした
0844デフォルトの名無しさん2012/12/31(月) 07:06:44.40
ファイルを読み込んで特定の文字列を別の文字列に置き換えるようにしたいです。

test01
うんこ
うんち
う○こ

のように書かれているとします。
このうち「う○こ」を「うんこ」に置き換えたいのですがどうすればいいですか?
ファイルに直接変更を加えるということです。
0845デフォルトの名無しさん2012/12/31(月) 10:37:49.71
ruby -i -p -e '$_ に対する置換処理' 対象ファイル
0846デフォルトの名無しさん2012/12/31(月) 11:02:01.60
>>844
例
1.ファイルを一時ファイルにコピーする。
2.もとのファイルの名前で新しいファイルをつくる(書込み用)
3.一時ファイルを1行ずつよんで、該当する部分を変更して書込み用ファイルに出力する。
0847デフォルトの名無しさん2012/12/31(月) 11:13:30.77
sub(pattern, replace)
文字列中で pattern にマッチした最初の部分を文字列 replace で置き換えた文字列を生成し返します

gsub(pattern, replace)
文字列中で pattern にマッチする部分全てを文字列 replace で置き換えた文字列を生成し返します

リファレンスマニュアル
0848デフォルトの名無しさん2012/12/31(月) 11:15:02.14
`sed -i -e "s/う○こ/うんこ/g" #{ファイル名}`
0849デフォルトの名無しさん2012/12/31(月) 11:17:08.53
行中の文字列置換だったらsedがばっちりその用途じゃん
rubyで考えるよりも早いんじゃない
0850デフォルトの名無しさん2012/12/31(月) 11:18:17.52
とおもったらすでに書かれていた
0851デフォルトの名無しさん2012/12/31(月) 18:59:24.83
Windowsにはsedはないから
>>847の方法を使う必要がある
フィルタ的に使うのに意外と
手間がかかるよねrubyは
0852デフォルトの名無しさん2012/12/31(月) 19:26:52.36
windosでのsed実装を探したほうが早くねってなる流れ
0853デフォルトの名無しさん2012/12/31(月) 20:07:43.05
時代はWindowsw
0854デフォルトの名無しさん2012/12/31(月) 20:09:58.73
>>852
Windows版なんて聞いたことないし、あったとしても
どこの馬の骨が作ったかわからないフリーソフトレベルだろうから
大事なテキスト処理は任せられないなあ
多くのユーザーに揉まれたUnixツール群は偉大だ
0855デフォルトの名無しさん2012/12/31(月) 20:36:15.57
cygwinくらい知ってろよ。
■ このスレッドは過去ログ倉庫に格納されています