Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

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

by fletcher_the_dog (Friar)
on Jul 14, 2003 at 21:57 UTC ( #274199=note: print w/replies, xml ) Need Help??


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

Here is a sort version of Jenda's solution
my @files = qw(model4run1 model2run1 model4run2 model1run1); my $same = $files[0]; $same &=$_ for @files; ($same) = split 0x00, $same,2; print "Prefix is \"$same\"\n";

Replies are listed 'Best First'.
Re: Re: Re: Find common prefix from a list of strings
by Jenda (Abbot) on Jul 14, 2003 at 22:05 UTC

    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

      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

      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://274199]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (6)
As of 2020-01-21 05:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?