On Wed, 24 Aug 2011 20:24:00 +0530, Ramprasad Prasad wrote:

> Assume I have to find the first unique character in a string
> 
> $string = "abtable";
> 
> # t is the first unique string
> 
> I tried using a negative backtrace lookup to get the answer in a single
> regex ... But something is missing.
> 
> /(.).(?!\1)/ && print $1;
> 
> it seems fine ... But doesn't work

The easier way would be with code instead of a regex:

use strict;
use warnings;
use 5.10.0;

@ARGV or @ARGV = (qw(abtable zzabtable abcabc zbbb abcdefabcdefg q qqq));

OUTER: for ( @ARGV )
{
  my @c = split //;
  my %n;
  $n{$_}++ for @c;
  for ( @c )
  {
    next if $n{$_} > 1;
    say;
    next OUTER;
  }
  say "FAIL: $_";
}

% ./proggie
t
t
FAIL: abcabc
z
g
q
FAIL: qqq

But if you really want a regular expression to do the job:

use strict;
use warnings;
use 5.10.0;

@ARGV or @ARGV = (qw(abtable zzabtable abcabc zbbb abcdefabcdefg q qqq));

for ( @ARGV )
{
  say
  /\A                       # Starts with
    (.*?)                   # Minimal string, possibly null, then
    (.)                     # Candidate character
    (??{                    # Evaluate code
         index($1,$2) >= 0  #  If first capture contains candidate
         ? '(*FAIL)'        #   Assert match failure
         : '(*ACCEPT)'      #   Else success
       })                   # Followed by
    (?!.*\2.*)              # Chars not containing candidate
  /x ? "$1\[$2\]${^POSTMATCH}" : "FAIL: $_";
}

%proggie
ab[t]able
zzab[t]able
FAIL: abcabc
[z]bbb
abcdefabcdef[g]
[q]
FAIL: qqq

-- 
Peter Scott
http://www.perlmedic.com/     http://www.perldebugged.com/
http://www.informit.com/store/product.aspx?isbn=0137001274
http://www.oreillyschool.com/certificates/perl-programming.php

-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to