case with && not working compared to using if, works!

D

Derek Smith

Hi All,

I looked through many threads for case issues and they did not help me.
I want to use case just because for this situation:


PIDF = "/usr/local/vr/prod/tmp/pids/mongrel.pid"
d = Date.today
t = Time.now
pidhash = Hash.new
pidhash[PIDF] = %x(ps auxwww |grep [m]ongrel|grep 80|awk '{print
$2}').chomp

File.open(PIDF).each do |line|
hasval = pidhash.value?(line) ### store true/false
if hasval
log_mtd("Running PID == PID in File
".+(d.to_s).+(t.hour.to_s).+(t.min.to_s))
exit
elsif (!hasval && File.size(PIDF) == 0)
puts "PID not active yet file exists", PIDF
exit
elsif (!hasval && File.size(PIDF) > 0)
puts "
exit
else
puts "no con met"
exit
end
end


I tried this syntax and it was not meeting my expected output:
So when I substitute line with a random # I expect the 2nd condition to
be printed which it is, but its not even evaling the File.size(PIDF). I
know this b/c I test it with a hard-coded file size.

hasval = pidhash.value?(7) ### store true/false
case hasval
when true
then
puts("Running PID == PID in File
".+(d.to_s).+(t.hour.to_s).+(t.min.to_s))
when (false && File.size(PIDF) == 1)
then
puts "2nd. PID not active yet file exists", PIDF
when (false && File.size(PIDF) == 0)
then
puts "3rd"
else
puts "no con met"
exit
end

test: 77 lines, 1826 characters.
[root@v /usr/local/vr/test/script]# ruby test
PID not active yet file exists
/usr/local/vr/prod/tmp/pids/mongrel.pid

[root@v /usr/local/vr/test/script]# ls -l
/usr/local/vr/prod/tmp/pids/mongrel.pid
-rw-r--r-- 1 root wheel 5 Nov 16 12:17
/usr/local/vr/prod/tmp/pids/mongrel.pid


thank you!
 
R

Ryan Davis

hasval =3D pidhash.value?(7) ### store true/false
case hasval
when true
then
puts("Running PID =3D=3D PID in File
".+(d.to_s).+(t.hour.to_s).+(t.min.to_s))
when (false && File.size(PIDF) =3D=3D 1)
then
puts "2nd. PID not active yet file exists", PIDF
when (false && File.size(PIDF) =3D=3D 0)
then
puts "3rd"
else
puts "no con met"
exit
end

It just doesn't work this way. It is nonsensical. Stick to your =
if/elsif/else and things will work fine.

About the nonsensical:

case x
when a
when b
...

is roughly equivalent to:

if a =3D=3D=3D x
elsif b =3D=3D=3D x
...

So what does this mean?

case hasval
when (false && File.size(PIDF) =3D=3D 1)

it roughly translates to:

if (false && File.size(PIDF) =3D=3D 1) =3D=3D=3D hasval

or by logical deduction:

if false =3D=3D=3D hasval

Which I doubt you meant.

Again, stick to simple if/elsif/else statements and you'll be happier.

Also, your code drives me bonkers. Check it:

puts("Running PID =3D=3D PID in File ". +(d.to_s). +(t.hour.to_s). =
+(t.min.to_s))

is about as pedantically awkward as you can get. Dot notation for the + =
operator?? NO!

At worst it should be:

puts "Running PID =3D=3D PID in File " + d.to_s + t.hour.to_s + =
t.min.to_s

Hey look! My space bar works! Also, My pinkies aren't so tired by typing =
so many parens!

Even better, use interpolation:

puts "Running PID =3D=3D PID in File #{d}#{t.hour}#{t.min}"

(tho that looks like it'll print out ugly, it is equivalent to your =
original code and is much more readable.)
 
D

Derek Smith

Even better, use interpolation:
puts "Running PID == PID in File #{d}#{t.hour}#{t.min}"

(tho that looks like it'll print out ugly, it is equivalent to your
original code and is much more readable.)


LOL...advice taken. Thanks Ryan. :)
 
B

Bertram Scharpf

Hi,

Am Montag, 14. Dez 2009, 05:22:00 +0900 schrieb Derek Smith:
hasval = pidhash.value?(7) ### store true/false
case hasval
when true
then
puts("Running PID == PID in File
".+(d.to_s).+(t.hour.to_s).+(t.min.to_s))
when (false && File.size(PIDF) == 1)
then
puts "2nd. PID not active yet file exists", PIDF
when (false && File.size(PIDF) == 0)
then
puts "3rd"
else
puts "no con met"
exit
end

Why use case or elsif at all? What you meant is probably:

if pidhash.value? 7 then
puts "1st: Running PID == PID in File #{d} #{t}"
else
if File.size(PIDF).nonzero? then
puts "2nd: PID not active yet file exists: #{PIDF}"
else
puts "3rd"
end
end

Bertram
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,185
Members
46,736
Latest member
AdolphBig6

Latest Threads

Top