こんにちは、山本です。

>    str = array.shift.nonnil{|x| x.sub(/^XX/, '')}
>
>などのようにすることなのですが、
>もっとシンプルに書く方法はないでしょうか?

>    str = array.shift.nonnil?.sub(/^XX/, '')
>
>のように書けたら嬉しいのですが、これは多分文法上不可能なんですよね?

__send__ を使えば、似たようなことができます。

class Object
  def trial(*a, &b)
    nil? || self == "" ? nil : __send__(*a, &b)
  end
end

for line in ["1\t2\t3", "1.0\t2\t", "1\t2\tXXfoo"]
  array = line.chomp.split("\t")
  float = array.shift.trial(:to_f)
  int   = array.shift.trial(:to_i)
  str   = array.shift.trial(:sub, /^XX/, '')
# str   = array.shift.trial(:sub, /^XX/) { '' }
  p [float, int, str]
end

http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Object#a__send__

Array に shift の変種を用意するともっとシンプルかもしれません。

class Array
  def shift2(*a, &b)
    x = shift
    x.nil? || x == "" ? nil : x.__send__(*a, &b)
  end
end

for line in ["1\t2\t3", "1.0\t2\t", "1\t2\tXXfoo"]
  array = line.chomp.split("\t")
  float = array.shift2(:to_f)
  int   = array.shift2(:to_i)
  str   = array.shift2(:sub, /^XX/, '')
# str   = array.shift2(:sub, /^XX/) { '' }
  p [float, int, str]
end