summaryrefslogtreecommitdiff
path: root/012/ch2.pl
blob: ffd870cb087d257d03fa5cc9a7179811f7ebe1ac (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env perl

use strict;
use warnings;

sub commonPath {
    # Normalize paths (merge multiple "/"s into a single one)
    map s|/+|/|g, @_;

    # This array stores the common path components so far
    my @common = split m|/|, shift, -1;

    # Iterate over arguments (paths) and update @common accordingly
    foreach my $path (@_) {
        my @current = split m|/|, $path, -1;

        # Cut @common if longer than the current one
        @common = @common[0 .. $#current] if $#current < $#common;

        # Cut @common to keep only the matching components
        foreach my $i (0 .. $#common) {
            if ($common[$i] ne $current[$i]) {
                @common = @common[0 .. $i-1];
                last;
            }
        }
    }

    # Corner case: @common == ('') means root
    return @common == 1 && $common[0] eq ''
        ? "/"
        : join "/", @common;
}

# CLI usage
if (@ARGV) {
    print commonPath(@ARGV), "\n";
} else {
    print "Usage: $0 path1 path2 ...\n";
}