[Vienna-pm] Gleichen Anfang in mehreren Zeilen entfernen

Thomas Klausner domm at zsi.at
Sun May 22 12:22:01 PDT 2005


Hi!

On Sun, May 22, 2005 at 07:45:47PM +0200, Stefan Weiss wrote:
> Moin.

Abend!

> Input:
> my $str = <<EOT;
> /home/user/dir1/dir2/file1.foo: some text
> /home/user/dir1/dir2/fee/fi/fo/fum.bar: some (more) tex/t
> /home/user/dir1/dir2/file3.baz(1243): text?
> EOT
> 
> Gew?nschter Output:
> file1.foo: some text
> fee/fi/fo/fum.bar: some (more) tex/t
> file3.baz(1243): text?
> 
> Es soll also der gemeinsame Pfad am Anfang aller Zeilen (wenn vorhanden)
> entfernt werden. 

Ich vermute mal, der zu entfernende Pfad ist nicht immer derselbe, weil
sonst waeres ja leicht.

> In diesem speziellen Fall fangen noch die
> unterschiedlichen Teile mit demselben Buchstaben an, der wenn m?glich
> erhalten bleiben sollte (aber mit solchen Details kann ich mich auch
> selbst spielen, wenn ich einen geeigneten Ansatz gefunden habe).

De facto willst du also aus einer Menge von Strings den gemeinsamen Anfang
rausfinden und den dann entfernen?

Ich glaube, das wird nur mit einer Regex o.ae. nicht gehen..

Du musst naemlich zuerst mal alle Eintraege durchschauen, um den laengsten
gemeinesamen Anfang zu ermitteln. Der Rest ist dann eine regex.

Hier mal ein (ev ein wenig dilletantischer, ich bin ja kein EDVler) Versuch:

use strict;
use warnings;

my $in="/home/user/dir1/dir2/file1.foo: some text
/home/user/dir1/dir2/fee/fi/fo/fum.bar: some (more) tex/t
/home/user/dir1/dir2/file3.baz(1243): text?";

my @data=split(/\n/,$in);
my %result;
foreach my $file (@data) {
    my @frags=split(/\//,$file);
    my $path;
    foreach (@frags) {
        $path.=$_."/";
        $result{$path}++;
    }
}

my $max=@data;
my $length=0;
my $longest;

while(my ($path,$cnt)=each %result) {
    next unless $cnt == $max;
    $longest=$path if length($path) > length($longest);
}

print "$longest\n";




-- 
#!/usr/bin/perl                               http://domm.zsi.at
for(ref bless{},just'another'perl'hacker){s-:+-$"-g&&print$_.$/}


More information about the Vienna-pm mailing list