Как я могу изменить каталог в строке Perl, которая имеет путь к файлу? - PullRequest
1 голос
/ 14 мая 2010

У меня есть строка с путем к файлу:

$workingFile = '/var/tmp/A/B/filename.log.timestamps.etc';

Я хочу изменить путь к каталогу, используя две переменные, чтобы отметить старую часть пути и новую часть пути:

$dir = '/var/tmp';
$newDir = '/users/asdf';

Я бы хотел получить следующее:

'/users/asdf/A/B/filename.log.timestamps.etc'

Ответы [ 4 ]

5 голосов
/ 14 мая 2010

Существует более одного способа сделать это. С правильным модулем вы сохраняете много кода и проясняете намерения.

use Path::Class qw(dir file);

my $working_file = file('/var/tmp/A/B/filename.log.timestamps.etc');
my $dir          = dir('/var/tmp');
my $new_dir      = dir('/users/asdf');

$working_file->relative($dir)->absolute($new_dir)->stringify;
# returns /users/asdf/A/B/filename.log.timestamps.etc
4 голосов
/ 14 мая 2010

Удалить косую черту из $ newDir и:

($foo = $workingFile) =~ s/^$dir/$newDir/;
0 голосов
/ 14 мая 2010

ответ sh-beta является верным, поскольку он отвечает на вопрос о том, как управлять строками, но в целом лучше использовать доступные библиотеки для манипулирования именами файлов и путями:

use strict; use warnings;
use File::Spec::Functions qw(catfile splitdir);

my $workingFile = '/var/tmp/A/B/filename.log.timestamps.etc';
my $dir = '/var/tmp';
my $newDir = '/usrs/asdf';

# remove $dir from $workingFile and keep the rest
(my $keepDirs = $workingFile) =~ s#^\Q$dir\E##;

# join the directory and file components together -- splitdir splits
# into path components (removing all slashes); catfile joins them;
# / or \ is used as appropriate for your operating system.
my $newLocation = catfile(splitdir($newDir), splitdir($keepDirs));
print $newLocation;
print "\n";

дает вывод:

/usrs/asdf/tmp/filename.log.timestamps.etc

File :: Spec распространяется как часть ядра Perl. Его документация доступна в командной строке с perldoc File::Spec или на CPAN здесь .

0 голосов
/ 14 мая 2010

Я совсем недавно делал подобные вещи.

$workingFile = '/var/tmp/A/B/filename.log.timestamps.etc';
$dir         = '/var/tmp';
$newDir      = '/users/asdf';

unless ( index( $workingFile, $dir )) { # i.e. index == 0
    return $newDir . substr( $workingFile, length( $dir ));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...