Модуль Perl знает, где он установлен?

Есть ли причина, по которой вы хотите, чтобы последнее поле было указано? «+» Не имеет особого значения в 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)}}; }, );
7
задан brian d foy 13 April 2009 в 17:28
поделиться

7 ответов

Каждый файл perl имеет доступ к переменной __ FILE__ , который сообщает ему полный путь. Что-то вроде этого должно сработать:

my $DEFAULT_TEMPLATE;
BEGIN {
    $DEFAULT_TEMPLATE = __FILE__;
    $DEFAULT_TEMPLATE =~ s,\.pm$,/default_email.tt,;
}

Тем не менее, если все, что вам нужно, это связать файлы «данных» с вашими модулями, взгляните на File :: ShareDir , который предоставляет способ сделать это.

9
ответ дан 6 December 2019 в 06:25
поделиться

Perl также записывает расположение файла в переменную% INC. Вы можете использовать это, когда __FILE__ не доступен. Подробности см. В документации perlvar .

3
ответ дан 6 December 2019 в 06:25
поделиться

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

  • Найти путь к модулю

     package FooBar;
    
    использовать File :: Spec;
    sub location {
    return File :: Spec-> rel2abs (__FILE__);
    }
    
  • Где разместить шаблон:

    Поскольку шаблон, скорее всего, будет редактируемым, возможно, даже кем-то, работающим в сети, я настоятельно рекомендую поместить его в каталог, где «код», содержащийся в шаблоне, не может быть выполнен. .

    Представьте, что кто-то звонит: http://your.home.net/cgi-bin/default_email.tt

2
ответ дан 6 December 2019 в 06:25
поделиться

Использование% 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";
7
ответ дан 6 December 2019 в 06:25
поделиться

Вы можете использовать хэш % 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);
5
ответ дан 6 December 2019 в 06:25
поделиться

Вы можете использовать токен __ FILE __ , чтобы получить имя (включая путь) текущего файла. Если вы хотите узнать путь к другому модулю (уже загруженному), проверьте содержимое хэша % INC .

1
ответ дан 6 December 2019 в 06:25
поделиться

Я использую этот псевдоним 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
1
ответ дан 6 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: