in reply to Re: result is not listening to if
in thread result is not listening to if

Hello! I just tought I would try to add a limit on the string output to an exercise in the Perl book I'm reading, The excercise was "8 Write a program that prompts for and reads a string and a number (on separate lines of input) and prints out the string the number of times indicated by the num- ber on separate lines. (Hint: use the x operator.) If the user enters “fred” and “3”, the output should be three lines, each saying “fred”. If the user enters “fred” and “299792,” there may be a lot of output." I though that if you put double quoutes around a variable value in Perl, Perl would know for example that "20" is a number. And that if you put variable value between single quotes like this "my $number = '20'. Perl would take it as a literal string. I'll check out those links thank you. Regards

Replies are listed 'Best First'.
Re^3: result is not listening to if
by hippo (Archbishop) on Jul 14, 2017 at 14:09 UTC
    I though that if you put double quoutes around a variable value in Perl, Perl would know for example that "20" is a number. And that if you put variable value between single quotes like this "my $number = '20'. Perl would take it as a literal string.

    I think you may have misread or misinterpreted something. "20" is exactly the same as '20' in perl. But if $z has value 20 then "$z" and '$z' are quite different.

    #!/usr/bin/env perl use strict; use warnings; my $dql = "20"; my $sql = '20'; my $z = 20; my $dqv = "$z"; my $sqv = '$z'; print "dql: $dql\n"; print "sql: $sql\n"; print "dqv: $dqv\n"; print "sqv: $sqv\n";

    The assignment to $dqv is what is known as interpolation. Double quotes do it but single quotes do not. See the "interpolates" column in the table in Quote and Quote-like Operators for the full list.

    Note that by putting any sort of quotes around a numerical value you are essentially converting it into a string. $z above is a pure number the other variables are all strings. But Perl isn't strongly typed so you can get away with plenty of mixing and matching.

    Addendum: The choice of variable names in this example might not be obvious. They are abbreviations for "double quoted literal", "single quoted literal", "double quoted variable" and "single quoted variable". (Thanks 1nickt for pointing out the lack of clarity).

      Ok Thank you, so if I understand correctly, if I want to make sure Perl interprets my value as a number I need to not put quotes around it?

        It's a bit more nuanced than that because, as I say, Perl isn't strongly typed. However it's still something I would encourage as good practice because:

        1. It makes your intention in the code very clear
        2. It will certainly make a difference when you start working in bases other than decimal
        3. It doesn't hurt

        While learning you can always try quick one-liners to see what happens when you try something. Feel free to experiment on your own. If you see behaviour you don't understand try to find it in the documentation or ask about it here.

Re^3: result is not listening to if
by thanos1983 (Parson) on Jul 14, 2017 at 14:36 UTC

    Hello again prospect,

    Regarding your question you can find a very similar question on the forum that contains many interesting answers: A function to determine if a string is numeric, similarly How to determine if something is numeric?.

    A most common way to convert a numerical string to int is casting int. For example from documentation:

    For example, int(-6.725/0.025) produces -268 rather than the correct - +269; that's because it's really more like -268.99999999999994315658 i +nstead.

    Hope this helps, BR.

    Seeking for Perl wisdom...on the process of learning...not there...yet!