in reply to Pushing to an array

This simplest change you could make to your code to achieve your goal would be to add a flag:

my $found = 0; foreach $folder_match(@folders) { if($mk =~ /^\/\Q$folder_match\E$/i) {# if $mk doesnot match to any +one of @folders,then only push $found = 1; } } if (not $found) { push @folder_match ,$mk; }

If I were given this task, I would use grep instead, though you could also accomplish this with help from List::MoreUtils.

Replies are listed 'Best First'.
Re^2: Pushing to an array
by Anonymous Monk on Mar 23, 2011 at 22:30 UTC

    For both the below inputs $found is "0",any idea why?Ideally for "inc" $found should match

    $mk =./media/common/max/tail/common.mk: $(PROJECT_ROOT)/../../Utils/inc -->$found should be 1

    $mk= ./media/common/max/tail/common.mk: $(PROJECT_ROOT)/../../Utils/inC -->$found should be 0

    #!/usr/bin/perl -w use strict; use warnings; my @folders=("inc","Inc","iNc","incr","src","Src"); my $mk = "./media/common/max/tail/common.mk: $(PROJECT_ROOT)/../../ +Utils/inc"; my $folder_match; my @folder_match; my $found = 0; foreach $folder_match(@folders) { if($mk =~ /^\/\Q$folder_match\E$/i) {# if $mk doesnot match to any+one of @folders,then only push $found = 1; } } print "\nFOUND:$found\n"; if (not $found) { push @folder_match ,$mk; } print "@folder_match\n";
      You issue is that $mk does not contain the string ./media/common/max/tail/common.mk:    $(PROJECT_ROOT)/../../Utils/inc as you expect. Variables interpolate in double quotes (see Quote and Quote like Operators), so you are interpolating the special variable $( in your string. You can resolve your issue by either escaping the $ character with a back slash

      my $mk = "./media/common/max/tail/common.mk:    \$(PROJECT_ROOT)/../../Utils/inc";

      or you can swap to string delimiters that do not interpolate, like single quotes

      my $mk = './media/common/max/tail/common.mk:    $(PROJECT_ROOT)/../../Utils/inc';