dirname($0)
nie zwraca pełną ścieżkę, jak Chankey Pathak i Matthias wykazać.
Chciałbym dodać, że istnieją inne sposoby. Na przykład, można użyć FindBin (również rdzeń)
use FindBin qw($RealBin);
BEGIN: {
my ($scriptDir) = $RealBin;
chdir $scriptDir or die "Can't change to $scriptDir: $!";
};
The $RealBin
daje takie samo jak to, co można pokazać, chyba że jest to pełna ścieżka z łączami rozwiązany.
chdir może zawieść, dzięki ikegami za komentarz. W takim przypadku zwracana jest wartość false, a powyższy kod umiera, należy odpowiednio dostosować. Zauważ, że kwestionowana trzecia linia nie ma z tym nic wspólnego.
Moduł ten jest również powszechnie wykorzystywane do względnej ścieżki do bibliotek z lib Pragma, na przykład
use lib "$RealBin/../lib";
co być może sprawia, że nawet łatwiejsze decyzji wykorzystania go dla obu stron.
Co więcej, biorąc pod uwagę opis dirname
z File::Basename (podkreślenie nie moja)
Funkcja ta jest udostępniona dla zgodności z poleceniem Unix shell dirname(1)
i odziedziczył niektóre ze swoich dziwactw.Pomimo swojej nazwy zawsze zwraca nazwę katalogu, jak można się spodziewać. Aby być bezpiecznym, jeśli chcesz mieć nazwę katalogu ścieżki, użyj fileparse()
.
wolałbym iść nawet z
use Cwd qw(abs_path);
BEGIN: {
my ($scriptDir) = abs_path(__FILE__) =~ m|(.*)/|;
chdir $scriptDir
or die "Can't change to $scriptDir: $!";
};
gdzie abs_path
jest używany od __FILE__
na własną rękę nie może zapewnić pełną ścieżkę. Regex łapczywie łapie wszystko aż do ostatniej, /
, czyli pełnej ścieżki do katalogu skryptu.
Jak pokazano poniżej, 'użyj FindBin qw ($ RealBin);' i nie zmieniaj katalogu. Pliki wymienione w '@ ARGV' odnoszą się do' pwd', a nie '$ RealBin'. – shawnhcorey