Есть ли причина, по которой вы хотите, чтобы последнее поле было указано? «+» Не имеет особого значения в CSV, поэтому не нуждается в кавычках и пустом поле. Text :: CSV_XS поддерживает цитирование пустых полей или цитирование всех полей, но еще не цитирование всех нечисловых полей. Основываясь на ответе Чоробы, который позволяет последнему полю быть «яблоко + яблоко + апельсин», который не определен в ОП, если это необходимо, я бы написал это так:
use 5.14.1;
use warnings;
use Text::CSV_XS qw( csv );
use Data::Peek;
chomp (my @fruits = do { local @ARGV = "file.txt"; <> });
my %order;
@order{@fruits} = 0 .. $#fruits;
my $regex = join "|", sort { length $b <=> length $a } @fruits;
csv (
in => "data1.csv",
eol => "\n",
quote_empty => 1,
on_in => sub {
push @{ Есть ли причина, по которой вы хотите, чтобы последнее поле было указано? «+» Не имеет особого значения в CSV, поэтому не нуждается в кавычках и пустом поле. Text :: CSV_XS поддерживает цитирование пустых полей или цитирование всех полей, но еще не цитирование всех нечисловых полей. Основываясь на ответе Чоробы, который позволяет последнему полю быть «яблоко + яблоко + апельсин», который не определен в ОП, если это необходимо, я бы написал это так:
[110][1]}, join "+" =>
sort { $order{$a} <=> $order{$b} }
keys %{{map { Есть ли причина, по которой вы хотите, чтобы последнее поле было указано? «+» Не имеет особого значения в CSV, поэтому не нуждается в кавычках и пустом поле. Text :: CSV_XS поддерживает цитирование пустых полей или цитирование всех полей, но еще не цитирование всех нечисловых полей. Основываясь на ответе Чоробы, который позволяет последнему полю быть «яблоко + яблоко + апельсин», который не определен в ОП, если это необходимо, я бы написал это так:
[110] => 1 }
( Есть ли причина, по которой вы хотите, чтобы последнее поле было указано? «+» Не имеет особого значения в CSV, поэтому не нуждается в кавычках и пустом поле. Text :: CSV_XS поддерживает цитирование пустых полей или цитирование всех полей, но еще не цитирование всех нечисловых полей. Основываясь на ответе Чоробы, который позволяет последнему полю быть «яблоко + яблоко + апельсин», который не определен в ОП, если это необходимо, я бы написал это так:
[110][1][1] =~ m/\b($regex)\b/g)}};
},
);
Каждый файл perl имеет доступ к переменной __ FILE__
, который сообщает ему полный путь. Что-то вроде этого должно сработать:
my $DEFAULT_TEMPLATE;
BEGIN {
$DEFAULT_TEMPLATE = __FILE__;
$DEFAULT_TEMPLATE =~ s,\.pm$,/default_email.tt,;
}
Тем не менее, если все, что вам нужно, это связать файлы «данных» с вашими модулями, взгляните на File :: ShareDir , который предоставляет способ сделать это.
Perl также записывает расположение файла в переменную% INC. Вы можете использовать это, когда __FILE__ не доступен. Подробности см. В документации perlvar .
Переписано, чтобы отразить то, что я узнал в комментариях:
Найти путь к модулю
package FooBar;
использовать File :: Spec;
sub location {
return File :: Spec-> rel2abs (__FILE__);
}
Где разместить шаблон:
Поскольку шаблон, скорее всего, будет редактируемым, возможно, даже кем-то, работающим в сети, я настоятельно рекомендую поместить его в каталог, где «код», содержащийся в шаблоне, не может быть выполнен. .
Представьте, что кто-то звонит: http://your.home.net/cgi-bin/default_email.tt
Использование% INC может ввести в заблуждение в тех случаях, когда файл не точно соответствует имени пакета. (Это анти-шаблон, но это действительно происходит, иногда по уважительным причинам.) Если вы хотите найти файлы, удобный токен __ FILE __
- ваш лучший выбор. Пример модуля, который может найти себя:
package Foo::Bar;
use Cwd qw(abs_path);
use File::Basename qw(dirname);
sub module_dir { abs_path(dirname(__FILE__)) }
1;
Использование:
use Foo::Bar;
print Foo::Bar->module_dir, "\n";
Вы можете использовать хэш % INC
, если модуль уже загружен. Например:
## load the module
use Data::Dumper;
## output full path to Data::Dumper module loaded
print $INC{'Data/Dumper.pm'};
## see which module was loaded (if you have multiple folders with same modules)
print Dumper(\%INC);
Вы можете использовать токен __ FILE __
, чтобы получить имя (включая путь) текущего файла. Если вы хотите узнать путь к другому модулю (уже загруженному), проверьте содержимое хэша % INC
.
Я использую этот псевдоним bash, чтобы найти местоположение модуля (например, чтобы посмотреть на его реализацию или взломать некоторые отладочные операторы печати):
perlwhere() {
perl -wle'eval "require $ARGV[0]" or die; ($mod = $ARGV[0]) =~ s|::|/|g; print $INC{"${mod}.pm"}' $1
}
$ perlwhere Test::More /usr/lib/perl5/5.8.8/Test/More.pm