Showing posts with label learn ruby the hard way. Show all posts
Showing posts with label learn ruby the hard way. Show all posts

Wednesday, December 17, 2014

Learning Regex con't (xxxxxxx-xxxx where x's are digits)

This one (regex) didn't take me as long to figure out given all that I read about regular expressions.

As part of my homework for Learning Ruby the Hard Way, I'm still working on my editor that takes 8 pieces of information and inserts it all into a tab delimited format .txt file.  The second column needs to be in the format of xxxxxxx-xxxx where the x's are digits and the hyphen needs to be included.  This is an account id in the system I'm working with where I'm going to eventually create a script to combine rows from files a 3rd party agency is giving to us.

Back to the editor, I created a regex to only accept an account id that has 7 digits, a hyphen followed by 4 more digits.  This one was easy compared to the online tutorials I was reading over.  Just inserting the regex here so I'll have it for future reference.

/^\d{7}\-\d{4}$/

Maybe by the time I'm finished with the 2 projects I want to complete, I'll have a cook book of regex's.

Tuesday, December 16, 2014

Learning Regex (file name with .txt extension)

I've gone through 6-7 web pages and 2 tutorials.  I did an initial search for a regex for a file name.  I didn't search but a minute or two then decided I need to learn a little more about regular expressions than just how to come up with one to recognize a file name.

After reading through a lot of documentation, I believe I came up with what I needed but first a little background.

I'm on lesson 36 of Learn Ruby the Hard Way.  I'm not making a game like the home suggests to.  Instead, I'm making a script that will ask for eight pieces of information and it will create a tab delimited file with each piece of information.  I'm giving the user the option to name the file.  The requirements will be that it must only contain letters (upper/lower case), digits, a hyphen and an underscore character and the file extension must end with a ".txt" (without the double quotes).  If the user types in anything else, it won't be accepted.

So I'm still at the beginning of creating this script and had to stop for a few days to learn how to put together regular expressions.  This is what I have so far for an acceptable file name.

I chose this type of project over creating a game because I need to ultimately create a script that parses a tab delimited file and combines rows/records based on values in 2 columns.  That will be my next project.

Here's the regex that I came up with to accept a file name with the above mentioned requirements.

/^[^\W+]\w+\-?(.txt$)/

I'm always open for suggestions on simplifying my code. I'm in no way an expert but the above expression works for what I need it for.  I'll be studying regular expressions in more depth as I continue on with my projects.

Sunday, November 30, 2014

User input stored as a string ($stdin.gets.chomp)

Following along with LRtHW on exercise 31 and I was wondering why the author was testing the user input as a string.

There was an exercise that covered gets.chomp but I never thought about it returning a string.  Then I found this documentation...


I was assuming that it would take the user input as is but the above link states...
  1. chomp is a string method (String#chomp).
  2. gets returns (gives you back) a string.
When I changed the code in the exercise from...

puts "You enter a dark room with two doors. Do you go through door #1 or door #2?"
print "> "
door = $stdin.gets.chomp
if door == "1"
  puts "There's a giant bear here eating cheese cake. What do you do?"
end

...to...

puts "You enter a dark room with two doors. Do you go through door #1 or door #2?"
print "> "
door = $stdin.gets.chomp.to_i
if door == 1
  puts "There's a giant bear here eating cheese cake. What do you do?"
end

..it worked as expected.

Ruby naming

Following along with the online LRTHW exercises and lesson 25. I copied the code as it was stated from the web page. Well, I typed it in manually rather than doing a copy and paste. Just to take a shortcut to type it in as fast as possible, I didn't capitalize the module name and I got the following error...

2.1.3 :001 > require "./ex25.rb"
SyntaxError: /home/.../ruby/ex25.rb:1: class/module name must be CONSTANT
from /home/.../.rvm/rubies/ruby-2.1.3/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from /home/.../.rvm/rubies/ruby-2.1.3/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:54:in `require'
from (irb):1
from /home/.../.rvm/rubies/ruby-2.1.3/bin/irb:11:in `<main>'

After going back and capitalizing the module name, function names and references to the functions, I was able to get it run without error.

2.1.3 :001 > require "./ex25.rb"
 => true 

Found official documentation that discusses naming.  The exercise didn't cover the topic of naming...

http://www.ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html