G'day WisDomSeeKer34,
Here's how I might tackle this:
#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
use constant PI => 4 * atan2 1, 1;
say 'Type radius (>=0) or just hit Return to exit.';
while (1) {
print 'Radius: ';
chomp(my $radius = <>);
last unless length $radius;
if ($radius =~ /^[+-]?(?:\d+|\d*[.]\d+)$/) {
if ($radius < 0) {
say "Radius [$radius] is less than zero. Try again.";
next;
}
say 'Circumference: ', 2 * PI * $radius;
}
else {
say "Invalid radius [$radius]. Try again.";
next;
}
}
Notes:
-
You don't need the utf8 pragma.
Read its documentation to see what it's for;
note the bold text telling you what it's not for.
-
Consider whether you really want to load a module and all of its functions.
As you only wanted pi, you could have loaded just that: "use Math::Trig 'pi';".
It isn't really a huge deal with a tiny script like this;
however, when you start writing more substantial code, it will matter.
I didn't bother with a module for this at all:
I just took the first example from the constant pragma.
-
For this type of task, consider a loop that you can break out of (with last) or restart from somewhere in the middle (with next).
-
Consider the user's exit condition.
I've used "just hit Return";
typing "q", "quit", "exit" are all valid but makes the user do more work.
In another scenario, hitting Return might take a default value, so something different is needed to exit.
-
Note the use of print for the prompt (without newline);
and the use of say for the feedback (with newline).
-
You can add another 'last' after printing the circumference
if you don't want this to keep looping.
Seek advice from your users on this:
if they're sitting there with a long list of radii,
they may not appreciate having to type the command repeatedly for each one.
-
The regex may look complicated but actually isn't.
It's basically just an optional, leading sign followed by two alternatives
(i.e. int or float).
See perlre if this is unfamiliar.
Example output:
$ ./pm_1216483_loop_qanda.pl
Type radius (>=0) or just hit Return to exit.
Radius: 123.456
Circumference: 775.696925283163
Radius: q
Invalid radius [q]. Try again.
Radius: 0
Circumference: 0
Radius: +0
Circumference: 0
Radius: -0
Circumference: 0
Radius: 0.00000001
Circumference: 6.28318530717959e-08
Radius: +0.00000001
Circumference: 6.28318530717959e-08
Radius: -0.00000001
Radius [-0.00000001] is less than zero. Try again.
Radius: .00000001
Circumference: 6.28318530717959e-08
Radius: +.00000001
Circumference: 6.28318530717959e-08
Radius: -.00000001
Radius [-.00000001] is less than zero. Try again.
Radius: 1
Circumference: 6.28318530717959
Radius: -1
Radius [-1] is less than zero. Try again.
Radius: 1.
Invalid radius [1.]. Try again.
Radius: .1
Circumference: 0.628318530717959
Radius: load of rubbish
Invalid radius [load of rubbish]. Try again.
Radius:
$
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.