@row = ("/aa/bb/cc","/aa/bb/cc/dd","/aa/bb/ff","/aa/bb/cc/dd/ee/ff");
# 一番長い階層数
my ${max_level}=0;
# 2次元配列の外側
my @outer;
# 入力階層配列の繰り返し
foreach my ${dir_str} (@row){
my $cnt;
# ディレクトリ構造を分解し配列に格納
my @dir_arr = split("/",${dir_str});
# ディレクトリ構造配列から空白を取り除く
my @dir_arr_define;
for(my $i=0;$i<@dir_arr;$i++){
if($dir_arr[$i]){
push(@dir_arr_define,$dir_arr[$i]);
${cnt}++;
}
}
# 一番長い階層数の更新
if(${cnt} > ${max_level}){
${max_level}=${cnt};
}
# 2次元配列に配列を格納
push @outer,[@dir_arr_define];
}
# 全てに共通するディレクトリ名
my ${common_dir_str};
# 一番長い階層数分繰り返す
OUTER:for($x=0;$x<${max_level};$x++){
# 前配列の同階層名保持
my $hold;
# 各配列の同じ階層繰り返し
for my $ref(@outer){
# 1つでも空白のある場合は共通しない部分があるので終了
last OUTER if(!$$ref[$x]);
# 繰返し1回目は前配列の同階層名保持がないので2回目以降チェック
if(${hold}){
# 前配列の同階層名と一致しない場合
# 共通しない部分があるので終了
last OUTER if(${hold} ne $$ref[$x]);
}
# カレント階層名を保持
${hold}=$$ref[$x];
}
# 全てに共通する階層名の文字連結
${common_dir_str} .= "/".${hold};
}
print ${common_dir_str};