LoginSignup
0
0

Ruby芸160チャレンジ(#1):複数行のテキストからサブセットを含む行の抽出

Last updated at Posted at 2023-11-30

この記事は何

shellgei160を通じて言語習得 Advent Calendar 2023に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

実行環境など

  • Docker image: ruby:3.0.2
  • 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下にanswer-rubyディレクトリを作り、その中に解答となるファイルを作成していきます。

今回のテーマ

$ grep '\.exe$' files.txt

上記相当の処理をRubyで考えてみます。

files = File.open('qdata/1/files.txt', 'r') do |f|
  f.readlines.map(&:chomp)
end

re = /\.exe$/

# せっかくなので色々なパターンを試してみる

puts '## use select'
puts(files.select { |file| file.match(re) })

puts '## use grep'
puts files.grep(re)

puts '## use keep_if'
puts(files.keep_if { |file| file.match(re) })

puts '## use delete_if'
puts(files.delete_if { |file| !file.match(re) })

puts '## use find_all'
puts(files.find_all { |file| file.match(re) })

puts '## use map'
puts(files.map { |file| file.match(re) ? file : nil })

puts '## use inject'
puts files.inject([]) { |result, file| file.match(re) ? result << file : result }

所感

  • テキストファイルの各行を読み込む処理に手間取った
  • サブセットとのマッチには正規表現を使う。ふむふむ。
  • files.grep、そういうのもあるのか…!
  • いろいろな形式で書けすぎるのも大変だった
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0