in reply to Re^2: Purpose of =~ and = in this statement
in thread Purpose of =~ and = in this statement

I really enjoyed the posts from haukex - all great advice.

There is another formulation of your "if this" then do "that" task. I see that chapter "numbers" could be a string like "11V". You also don't say, but I suspect that there are other statements like your chapter 5 statement for other chapters.

Instead of this being chapter number 5 specific, you could have a regex something like this at the beginning of the loop which would apply to any chapter string, not just chapter 5:

$chapter =~ s/\D+//g; # remove all non-digit characters # or perhaps to avoid the /g flag, (I wouldn't code it this way # because it is overly complex) however: $chapter =~ s/^(\D*)(\d+)(\D*)/$2/; # remove all optional non-digit s +tuff # before or after the digits # try the above with "XX546YYY", just "453ZZ" and "AAA123ZZZ77548" as # cases to probe the limits... what happens if it is not just "11VI"?
In both of the statements above, the string "5" is unaffected, but if it has some extra stuff like "5VI", the "VI" is removed. I would put a statement like that the beginning of the loop because it handles all number possibilities.

A subtle point is that a "number" in Perl could be represented by a "string" or an actual "numeric value". By and large, you do not have to worry about this because Perl will "do the right thing". Your statement says: if the string that represents "chapter" contains a "5", then set chapter to a numeric 5 (meaning binary 0000101 instead of whatever the string "5" or "657"codes to).

Perl makes this "string representing a number" to "actual binary number" conversion for you automatically. So, this is fine:

my $x = "3"; if ($x > 3){...}
In order to do the numeric comparison, Perl will convert the string "3" to binary and compare that to 000011.

my $x = "chapter 5"; print "chap 5 ok!" if $x == 5; # Throws Warning: Argument "chapter 5" isn't numeric in numeric eq (== +) $x =~ s/\D+//g; # eliminate all non 0-9 characters from string print "chap 5 ok!" if $x == 5; # chapter 5 is ok now! # The string got "fixed" to be completely numeric # Then when Perl made it into binary number to compare against 5, it w +orked!
BTW, there is one non-numeric string which Perl will convert to numeric without a warning: "zero0 but true". That will equal numeric binary zero, but will test as "true" in logical expression. The modern way to do that is the string "0E0". The DBI can use this in some situations where it wants to say: 1)the command worked (true), but 2) there were no valid results returned, i.e. numeric zero. Pretty Cute!

One place where the difference between string and numeric representations of a number can occur is with leading zeroes.

$x = "00005"; print "$x\n"; #yields "00005" $x += 0; #adding zero forces numeric conversion print "$x\n"; #yields "5"
In some situations, I need an integer binary value anyway to put into some DB and what I receive as textual description of that number may have a leading zero. Instead of using regex, I just add zero that number. bingo, $num +=0; $num now has a binary representation in Perl whether it did or not before and there will not be any leading zeroes if I print it or use it otherwise in a string context.

Replies are listed 'Best First'.
Re^4: Purpose of =~ and = in this statement
by Anonymous Monk on May 26, 2022 at 07:10 UTC
      Thanks for the correction, my memory was fuzzy.

      I think that this string "0 but true" is a very ancient artifact dating from before scientific notation. I have never seen this in my coding. I have however encountered "0E0" with the DBI as the normal, standard way to say "statement worked correctly, but produced a zero result", true in a logical comparison sense, but numeric zero in a numeric sense.

        "0 but true" is the self-documenting way to have a zero value evaluating to true, "0E0" is the clever but not so obvious one.


        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)