A heredoc stores multiline text that can be split and processed line by line.

heredoc A heredoc creates a multiline string while keeping the text readable in source code.

Heredoc Lines

prefix
heredoc_lines.rb
Replay: real traced execution (multi-file project)
prefix = "TODO"

notes = <<~TEXT
  TODO wash
  DONE fold
  TODO pack
TEXT

lines = notes.lines.map do |line|
  line.strip
end

selected = lines.select do |line|
  line.start_with?(prefix)
end

puts "prefix=#{prefix}"
puts "line_count=#{lines.length}"
selected_text = selected.join(", ")

puts "selected=#{selected_text}"
prefix = "DONE"

notes = <<~TEXT
  TODO wash
  DONE fold
  TODO pack
TEXT

lines = notes.lines.map do |line|
  line.strip
end

selected = lines.select do |line|
  line.start_with?(prefix)
end

puts "prefix=#{prefix}"
puts "line_count=#{lines.length}"
selected_text = selected.join(", ")

puts "selected=#{selected_text}"
prefix = "NOTE"

notes = <<~TEXT
  TODO wash
  DONE fold
  TODO pack
TEXT

lines = notes.lines.map do |line|
  line.strip
end

selected = lines.select do |line|
  line.start_with?(prefix)
end

puts "prefix=#{prefix}"
puts "line_count=#{lines.length}"
selected_text = selected.join(", ")

puts "selected=#{selected_text}"
  1. prefix ← TODO, notes ← TODO wash\nDONE fold\nTODO pack\n, lines ← ["TODO wash", "DONE fold", "TODO pack"]

    1prefix→ TODO = "TODO"  #@prefix="DONE", "NOTE"23notes→ TODO wash\nDONE fold\nTODO pack\n = <<~TEXT4  TODO wash5  DONE fold6  TODO pack7TEXT89lines→ ["TODO wash", "DONE fold", "TODO pack"] = notes(empty).lines.map do |line|10  line.strip11end1213selected→ ["TODO wash", "TODO pack"] = lines(empty).select do |line|14  line.start_with?(prefix)15end1617puts "prefix=#{prefixTODO}"18puts "line_count=#{lines.length3}"19selected_text→ TODO wash, TODO pack = selected.join(", ")TODO wash, TODO pack2021puts "selected=#{selected_textTODO wash, TODO pack}"
    outputprefix=TODO
    line_count=3
    selected=TODO wash, TODO pack
  1. prefix ← DONE, notes ← TODO wash\nDONE fold\nTODO pack\n, lines ← ["TODO wash", "DONE fold", "TODO pack"]

    1prefix→ DONE = "DONE"23notes→ TODO wash\nDONE fold\nTODO pack\n = <<~TEXT4  TODO wash5  DONE fold6  TODO pack7TEXT89lines→ ["TODO wash", "DONE fold", "TODO pack"] = notes(empty).lines.map do |line|10  line.strip11end1213selected→ ["DONE fold"] = lines(empty).select do |line|14  line.start_with?(prefix)15end1617puts "prefix=#{prefixDONE}"18puts "line_count=#{lines.length3}"19selected_text→ DONE fold = selected.join(", ")DONE fold2021puts "selected=#{selected_textDONE fold}"
    outputprefix=DONE
    line_count=3
    selected=DONE fold
  1. prefix ← NOTE, notes ← TODO wash\nDONE fold\nTODO pack\n, lines ← ["TODO wash", "DONE fold", "TODO pack"]

    1prefix→ NOTE = "NOTE"23notes→ TODO wash\nDONE fold\nTODO pack\n = <<~TEXT4  TODO wash5  DONE fold6  TODO pack7TEXT89lines→ ["TODO wash", "DONE fold", "TODO pack"] = notes(empty).lines.map do |line|10  line.strip11end1213selected→ [] = lines(empty).select do |line|14  line.start_with?(prefix)15end1617puts "prefix=#{prefixNOTE}"18puts "line_count=#{lines.length3}"19selected_text→ (empty) = selected.join(", ")(empty)2021puts "selected=#{selected_text(empty)}"
    outputprefix=NOTE
    line_count=3
    selected=