Perl -> サンプル




全てに共通する階層名の抽出

以下のディレクトリにがあった場合

/aa/bb/cc
/aa/bb/cc/dd
/aa/bb/ff
/aa/bb/cc/dd/ee/ff

全てに共通する部分は、
/aa/bb
である

これを perl スクリプトで抽出してみる。
階層共通部分抽出スクリプト

@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};



      Document-Folder          一覧
HP-UX
HULFT
JAVA
JP1
JavaScript
Linux
MAC
PHP
Perl
Python
Ruby
SOA
Solaris
Unix全般
Windows
XML
エクセル
スタイルシート
セキュリティー
データベース
ネットワーク
パソコン
ブラウザ
プログラム構文
仮想化
          RSS-Folder
ニュース
   アットマーク・アイティ(@IT)
   シンクイット(ThinkIT)
   インターネットコム
   インターネットウォッチ
   日経IT-Pro
   日経パソコン
   CNET Japan
   ZD-NetJapan
   MYCOM
   RBB-Today
ベンダー
   日本IBM
   日本HP
   サンマイクロシステムズ
   NEC
   富士通
   日立
ソフトウェア
   マイクロソフト
   トレンドマイクロ
   オラクル
   サイボウズ
   Mozilla
   野村総合研究所
   (その他ソフトウェア企業)
更新履歴 一覧
 07/08 PERF
プログラム構文
 07/07 PERF
プログラム構文
 06/25 オブジェクトプログラミング2
Perl>サンプル
 07/12 クローン作成
仮想化>vCenter
 07/12 vyatta設定
ネットワーク>vyatta
 07/12 vyattaインストール
ネットワーク>vyatta
 07/12 リポジトリサーバ
Linux>サーバ構築
 07/05 VMwareのインストール
仮想化>VMware
 07/05 PXEブート
仮想化>KVM
 07/01 DHCPでのPXEブート
仮想化>KVM
 06/27 qcow2仮想DISK作成
仮想化>KVM
 06/13 NWの設定
仮想化>VMwareEsxi
 06/13 IPアドレスの変更
仮想化>VMwareEsxi
 06/12 自動ssh
Unix全般>シェル>Bash
 06/12 diffプログラミング
Python
Google