如何在Perl哈希中表示文件系统的符号链接?
发布时间:2020-12-15 21:50:08  所属栏目:大数据  来源:网络整理 
            导读:在服务器故障,How to list symbolic link chains?(不是我的问题)谈论列出所有符号链接并跟随它们.为了使这个可行,我们首先考虑一个目录. 我想写一个实用程序的简短实用程序.将符号链接中的对放入哈希中然后处理哈希看起来很容易. 但后来我可能有类似的东西:
                
                
                
            | 
                         在服务器故障,How to list symbolic link chains?(不是我的问题)谈论列出所有符号链接并跟随它们.为了使这个可行,我们首先考虑一个目录. 
  
  
我想写一个实用程序的简短实用程序.将符号链接中的对放入哈希中然后处理哈希看起来很容易. 但后来我可能有类似的东西: ls -l total 0 lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:03 c -> a lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 trap -> b lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 x -> y lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:17 y -> b 很明显a-> b-> c是一个循环,并且该陷阱指向一个循环,但要知道x指向一个循环,我需要跟随一点. 一个哈希表示是: a => b b => c c => a trap => b x => y y => b 但是一旦我知道循环是什么,反向表示更好地将循环标记为坏起点. 所以这里有一些问题: >哈希是表示符号链接的最佳结构吗? 解决方法
 您可以在CPAN上使用 
 Graph模块,如下所示: 
  
  
  
        #! /usr/bin/perl
use warnings;
use strict;
use Graph;
my $g = Graph->new;
my $dir = @ARGV ? shift : ".";
opendir my $dh,$dir or die "$0: opendir $dir: $!";
while (defined(my $name = readdir $dh)) {
  my $path = $dir . "/" . $name;
  if (-l $path) {
    my $dest = readlink $path;
    die "$0: readlink $path: $!" unless defined $dest;
    $g->add_edge($name => $dest);
  }
  else {
    $g->add_vertex($name);
  }
}
my @cycle = $g->find_a_cycle;
if (@cycle) {
  $" = ' -> '; #" # highlighting error
  print "$0: $dir: at least one cycle: @cyclen";
}
else {
  print "$0: $dir: no cyclesn";
} 
 例如,在与您的问题中的结构类似的目录中,输出是 $../has-cycle ../has-cycle: .: at least one cycle: c -> a -> b (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
