in reply to Counting SubStrings, Style Question

split's purpose to break down a separated list of items. The first argument of split should normally match the separator, not what you want to extract.

my $parent = 'xxx xxx xxx'; my $count = my @items = split(/ /, $parent); print "$count\n"; # 3

Since you have a count, all you need to check if there are duplicates is check the count.

if ($count < 1) { print "None\n"; } elsif ($count < 2) { print "Unique\n"; } else { print "$count\n"; }

This is a style/performance question.

It sounds from your description that you can have an input like

my $parent = 'xxx yyy xxx zzz';

If so, you should worry about using a *working* solution first.

my $substring = 'xxx'; my $parent = 'xxx yyy xxx zzz'; my @count = split($substring,$parent); my $total = $#count + 1; print "there are $total $substring in $parent\n"; # XXX 3

This stems from your misuse of split.

In this case, I'd use

my $substring = 'xxx'; my $parent = 'xxx yyy xxx zzz'; my $count = () = $parent =~ /\Q$substring/; if ($count < 1) { print "None\n"; } elsif ($count < 2) { print "Unique\n"; } else { print "$count\n"; }

Replies are listed 'Best First'.
Re^2: Counting SubStrings, Style Question
by Anonymous Monk on Mar 20, 2010 at 23:24 UTC

    Your conditions are wrong:

    { my $c = my @c = split 'xxx', 'fred bill xx joe'; print $c };; 1 { my $c = my @c = split 'xxx', 'fred bill xxx joe'; print $c };; 2
      My conditions are not wrong.
      for my $count (0..4) { print("$count: "); if ($count < 1) { print "None\n"; } elsif ($count < 2) { print "Unique\n"; } else { print "$count\n"; } }
      0: None 1: Unique 2: 2 3: 3 4: 4
      Or using your examples
      my $substr = 'xxx'; for my $parent ( 'fred bill xx joe', 'fred bill xxx joe', ) { my $count = () = $parent =~ /\Q$substr/; if ($count < 1) { print "None\n"; } elsif ($count < 2) { print "Unique\n"; } else { print "$count\n"; } }
      None Unique

      It's the count is wrong. My entire post is about how split is not the right tool here because it can give the wrong count. That's why my solution doesn't use split.

        I guess I imagined this:

        my $parent = 'xxx xxx xxx'; my $count = my @items = split(/ /, $parent); print "$count\n"; # 3 [download] Since you have a count, all you need to check if there are duplicates +is check the count. if ($count < 1) { print "None\n"; } elsif ($count < 2) { print "Unique\n"; } else { print "$count\n"; }

        And also missed where the OP agreed that his sample code is wrong...Oh! He hasn't.