Personally I would try not do this:
search_by_tags(split ',', $cgi->param('tags'));
because it does not take account of the possibility that there is no param "tags" and then you would be calling split on an undefined value. This isn't really bad in and of itself but it encourages the use of this pattern for other, potentially more dangerous operations than split which may have worse consequences. I'd pass the string/undef and let the sub check for undef and only then attempt the split. eg:
search_by_tags ($cgi->param('tags'));
#...
sub search_by_tags {
my $tagstr = shift;
return unless defined $tagstr;
my @tags = split (/,/, $tagstr);
}
This also gives you the opportunity within the subroutine to raise an exception in the undef case which might be helpful.