Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: Re: Re: Find common prefix from a list of strings

by Jenda (Abbot)
on Jul 14, 2003 at 22:05 UTC ( #274203=note: print w/replies, xml ) Need Help??


in reply to Re: Re: Find common prefix from a list of strings
in thread Find common prefix from a list of strings

Uh oh ... I wanted to point out that your solution is wrong, found a conter example and ... it broke my code as well :-(

Here is a fixed solution:

@files = qw(model4run1 model5run1); #@files = qw(model4run1 model2run1 model4run2 model1run1); my $first = shift(@files); my $and = $first; my $or = $first; foreach (@files) { $and &= $_; $or |= $_; } my $combined = $and ^ $or; $combined =~ s/[^\x00].*//; my $prefix = substr($first, 0, length($combined)); print qq{Prefix is "$prefix"};

Jenda
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.
   -- Rick Osborne

Edit by castaway: Closed small tag in signature

Replies are listed 'Best First'.
Re: Re: Re: Re: Find common prefix from a list of strings
by antirice (Priest) on Jul 15, 2003 at 00:46 UTC

    There's another case this will fail for:

    @files = qw(model4run1 model2run1 model4run2 abbot); ... print Jenda(@files),$/; __DATA__ model4

    antirice    
    The first rule of Perl club is - use Perl
    The
    ith rule of Perl club is - follow rule i - 1 for i > 1

      Whadaheck?
      ...
      The problem was in the

      $combined =~ s/[^\x00].*//;
      I tried to print the variable with</code> print "\$combined=",unpack("H*",$combined)," ($combined)\n"; </code> and was really surprised:
      ¢¼combined=0c0d060a183672756e33 (”Ļ ”č6run3) $combined=0a183672756e33 ( ”č6run3) Prefix is "model4r"
      (I'd be even more surprised if this went through correctly.)

      Guess what was the problem ... well the .* did not match everything. I forgot that without /s dot doesn't match newlines. So the fix is very simple

      ... $combined =~ s/[^\x00].*//s; ...
      Actually thinking about this it would probably be better to change the last three lines to:
      $combined =~ /^(\x00*)/; my $prefix = substr($first, 0, length($1)); print qq{Prefix is "$prefix"};

      I should have tested my code better :-(

      Jenda
      Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.
         -- Rick Osborne

      Edit by castaway: Closed small tag in signature

Re: Re: Re: Re: Find common prefix from a list of strings
by fletcher_the_dog (Friar) on Jul 15, 2003 at 14:29 UTC
    Hmm, well I guess that is what I get for only doing testing on the example array. I guess I misunderstood how the & worked on strings, I thought it did it on a byte/character basis and only on bit basis for numbers. Thanks for finding this counter example.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://274203]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (7)
As of 2020-01-20 09:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?