in reply to Re: Bizarre Perl behavior?
in thread Bizarre Perl behavior?

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; }

Replies are listed 'Best First'.
Re^3: Bizarre Perl behavior?
by eyepopslikeamosquito (Archbishop) on Jan 31, 2022 at 07:15 UTC

    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:

Re^3: Bizarre Perl behavior?
by jwkrahn (Abbot) on Jan 31, 2022 at 04:05 UTC

    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; }