From: Nate Wiger Date: 2006-10-21T03:40:16+09:00 Subject: Easy way to check is sub!() succeeds? Hi all, I'm trying to port some Perl code to Ruby as part of learning the language. This code is part of a script called "untar", which is a simple suffix-based wrapper around unzip/cpio/gunzip/tar/etc. It starts with suffix to command maps: zip = { 'gz' => 'gunzip -c', 'Z' => 'uncompress -c', 'zip' => 'unzip', 'bz2' => 'bunzip2 -c' } I then want to loop over all files specified, and check if the suffix matches. If so, I want to strip it and set the proper command. My first attempt was this: ARGV.each do |file| zip.each do |suf, cmd| if file.sub!(%r{\.#{suf}$}, '') untar = cmd break end end # ... more code end But sub! always returns nil, even when it succeeds (in Perl, it will return the number of substitutions made, enabling "next if s/\.$suf$//") So now I have this: ARGV.each do |file| zip.each do |suf, cmd| if (new = file.sub(%r{\.#{suf}$}, '')) != file unzip = cmd file = new break end end # ... more code end Which works, but is not so pretty. Any ideas? -Nate P.S. This script allows multiple suffices, aka .tar.bz2, .tar.gz, etc, hence why it needs to loop repeatedly and strip each one (much code is not shown above)