#!/usr/local/bin/perl -w use strict; use Cwd; sub symlink_resolve { my $symlink = "./" . shift; my ($path, $file); my $here = getcwd (); while (-l $symlink) { ($path, $file) = $symlink =~ m|(.*/)(.*)|s; chdir ($path) || return undef; $symlink = "./" . readlink ($file) || return undef; } ($file) = $symlink =~ m|(?:.*/)(.*)|; $path = getcwd () || return undef; chdir ($here) || die; return "$path/$file"; } { # # Delete it if already exists # unlink 'sym.final', 'sym.temp/sym.link1', 'sym.link2', 'sym.temp/sym.link3', 'sym.link4'; rmdir 'sym.temp'; mkdir 'sym.temp', 0777; open (FH, '>sym.final') || die; close FH; # # Create a symlink: ~/sym.link4 -> ~/sym.temp/sym.link3 -> ~/sym.link2 -> ~/sym.temp/sym.link1 -> ~/sym.final # symlink ('../sym.final', 'sym.temp/sym.link1') || die; symlink ('sym.temp/sym.link1', 'sym.link2') || die; symlink ('../sym.link2', 'sym.temp/sym.link3') || die; symlink ('sym.temp/sym.link3', 'sym.link4') || die; # # The test... Should tell us that sym.link4 resolves to sym.final # die unless my $file = symlink_resolve ('sym.link4'); print "sym.link4 resolves to $file\n"; # # Clean up after ourselves # unlink 'sym.final', 'sym.temp/sym.link1', 'sym.link2', 'sym.temp/sym.link3', 'sym.link4'; rmdir 'sym.temp'; }