From: WATANABE Hirofumi Date: 2005-03-21T15:04:25+09:00 Subject: Re: equivalent idiom for ruby " perl -pe 's/(\d+)/localtime($1)/e'" Hi, Jason Sweat writes: > I see that > > ruby -pe '$_.gsub!(/^(\d+)/, Time.at($1.to_i).to_s)' /var/log/squid/access.log > > works as well. $1 becomes a result of the match last time, beause $1 is evaluated before gsub! is called. % ruby -e '1111111111.upto(1111111115){|i| puts i}' |\ ruby -pe '$_.gsub!(/^(\d+)/, Time.at($1.to_i).to_s)' Thu Jan 01 09:00:00 JST 1970 Fri Mar 18 10:58:31 JST 2005 Fri Mar 18 10:58:32 JST 2005 Fri Mar 18 10:58:33 JST 2005 Fri Mar 18 10:58:34 JST 2005 So you should use a block. % ruby -e '1111111111.upto(1111111115){|i| puts i}' |\ ruby -pe '$_.gsub!(/^(\d+)/){Time.at($1.to_i).to_s}' Fri Mar 18 10:58:31 JST 2005 Fri Mar 18 10:58:32 JST 2005 Fri Mar 18 10:58:33 JST 2005 Fri Mar 18 10:58:34 JST 2005 Fri Mar 18 10:58:35 JST 2005 Golf: % echo 1111111111 |ruby -pe 'sub(/^\d+/){Time.at($&.to_i)}' Fri Mar 18 10:58:31 JST 2005 -- eban