Ну, ответ на то, что происходит, будет: различные ошибки.
my $filepath = "/Users/Eric/Documents/foldername/filename.pdf";
$filepath =~ m/^.*\\(.*[.].*)$/;
print "Linux path:";
print $1 . "\n\n";
print "-------\n";
$filepath
не содержит \\
s, поэтому он не будет совпадать, и нет $1
. Вы положили /
с. Ваше выражение должно быть:
# regular expression matches return their captures in a list context.
my ( $path ) = $filepath =~ m|/([^/.]*\.[^/.]*)$|;
print "Linux path:$path\n\n-------\n"; # little need to . a " string
my $filepath = "c:\\Windows\eric\filename.pdf";
$filepath =~ m/^.*\\(.*[.].*)$/;
print "Windows path:";
print $1 . "\n\n";
print "-------\n";
Вы используете двойные кавычки, которые, если брать их реплики из оболочек UNIX, более активны, чем строки в одинарных кавычках. Таким образом, вам нужно экранировать все ваши обратные слеши, как это:
my $filepath = "c:\\Windows\\eric\\filename.pdf";
или просто используйте одинарные кавычки:
my $filepath = 'c:\Windows\eric\filename.pdf';
На самом деле, поскольку Perl понимает '/'
для Windows, это тоже работает (но не для регулярных выражений).
my $filepath = "c:/Windows/eric/filename.pdf";
Пока вы исправляете это, прежде чем возвращать его в Windows.
my $filepath = "filename.pdf";
$filepath =~ m/^.*\\(.*[.].*)$/;
print "Without path:";
print $1 . "\n\n";
print "-------\n";
Это не совпадение , поэтому $1
остается последним совпадением. Вот почему это повторяется. Но это указывает на ценность ловли взятий вместо ссылки на $1
.