Allow me to offer an alternative solution without using regex. Since the problem is is to compare a string with a sub-string, substr() function can be used:
my $end = ['.a[bc', '.de[f', '.xy]z'];
my $name= "test.a[bc" ;
my $found = grep { (substr($name, length($name) - length($_)) eq $_) } @$end;
print $found ? "Yes\n": "No\n";
This is assuming length($name) >= length($_). In fact, the behaviour of substr can also allow us to simply pass a negative offset (2nd parameter):
my $found = grep { (substr($name, -length($_)) eq $_) } @$end;
One thing to note here is that substr() generally produce no errors and warnings and still do something -- since it takes both positive and negative offset values. (Check perldoc of substr (command: perldoc -f substr) for more details).
You can avoid those "surprises" by adding a pre-condiditon to guard this seemingly trivial assumption:
my $found = grep {
(length($name) > length($_)) &&
(substr($name, -length($_)) eq $_)
} @$end;
This does makes sense: if the content in $_ is longer than $name, by definition it cannot be the suffix of $name anyway.