perl - File::Basename->fileparse возвращает "File::Basename"

По какой-то причине мой код делает эту странную вещь, где fileparse только печатные издания (буквально) File::Basename

 use strict;
 use warnings 'all';
 use File::Basename;

 ...

 my $fileName = File::Basename->fileparse($filePath);
 print("$filePath\n");
 print("$fileName\n");

И вывод:

a/b/c/d.bin
File::Basename

Что я сделал не так?

1 ответ

Решение

fileparse это не метод; это функция. Эта функция экспортируется по умолчанию, так что вы действительно хотите сделать

use File::Basename;
my $fileName = fileparse($filePath);

Вы использовали это как вызов метода. Вот File::Basename->fileparse($filePath) эквивалентно

fileparse("File::Basename", $filePath)

потому что в вызове метода инвокант (обычно объект; здесь имя пакета) становится первым аргументом. Это неправильно, так как относится "File::Basename" в качестве пути для анализа, а следующие аргументы в виде списка допустимых суффиксов.

Если вы хотите использовать fileparse функция без экспорта в ваше пространство имен, вы могли бы

use File::Basename (); # note empty parens that supress the import
File::Basename::fileparse(...); # use fully qualified name
Другие вопросы по тегам