Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: Bizarre Perl behavior?

by LanX (Saint)
on Jan 30, 2022 at 20:24 UTC ( [id://11140972]=note: print w/replies, xml ) Need Help??


in reply to Bizarre Perl behavior?

the problem is most likely inside test_if_letters_are_included() and since you are looping over while (scalar @list_words) you are expecting the array to be reduced "somewhere", but without showing us where.

Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery

Replies are listed 'Best First'.
Re^2: Bizarre Perl behavior?
by Polymathic (Novice) on Jan 30, 2022 at 20:54 UTC

    I though that at first too. But the subroutine has a prompt for user input after the previous standard output. So the loop stops after every standard out until the array is empty. Both of the print statements are printing after the subroutine so it should be printing same @list_words. Right?

    The subroutine asks the user for a string of characters and uses them as a character set in a regex. Any of the words that don't contain any of the characters are removed from the list.

    sub test_if_letters_are_included{ # Ask for input say 'Which letters would you like to use?:'; # Capture user input my $input = <STDIN>; # Remove the trailing newline chomp $input; # Change the input to upper case. $input = uc $input; # create a character set for the regex my $regex ="[$input]"; my @temp_list; for (@list_words) { if ($_ =~ /$regex/g) { push @temp_list, $_; } } @list_words = @temp_list; }

      As a general tip for future questions, it's considered good manners here to include a SSCCE.

      Without a SSCCE it's hard to tell, but your test_if_letters_are_included subroutine appears to be setting a global variable @list_words. Is that right? In your code, where is @list_words declared? What is its scope?

      As a matter of general programming style, a subroutine that sets a global variable is a red flag to me. As for why:

      Another way to write that:

      sub test_if_letters_are_included { # Ask for input say 'Which letters would you like to use?:'; # Capture user input my $input = <STDIN>; # create a character set of input letters my $chars = uc join '', $input =~ /[[:alpha:]]/g; @list_words = grep /[$chars]/, @list_words; }

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11140972]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others musing on the Monastery: (7)
As of 2024-04-23 19:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found