use warnings; use strict; use Path::Class qw/file dir/; my $file = file('/tmp/foolink/bar/quz'); my $prev; while (1) { die "doesn't exist: $file" unless -e $file; print $file, " is a ", -l $file ? 'link to '.readlink($file) : -f $file ? 'file' : -d _ ? 'dir' : 'special', "\n"; $prev = $file; $file = $file->parent; last if $prev eq $file; } __END__ /tmp/foolink/bar/quz is a file /tmp/foolink/bar is a dir /tmp/foolink is a link to foo /tmp is a dir / is a dir