この記事は何
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
、そういうのもあるのか…! - いろいろな形式で書けすぎるのも大変だった