Как я могу распечатать к переменной вместо файла в Perl?

От http://www.cplusplus.com/reference/stl/vector/

Векторные контейнеры реализованы как динамические массивы; Так же, как эквидистантные антенные решетки векторным контейнерам сохранили их элементы в непрерывных местах хранения, что означает, что к их элементам можно получить доступ не только с помощью итераторов, но также и с помощью смещений на регулярных указателях к элементам.

, Но в отличие от эквидистантных антенных решеток, устройство хранения данных в векторах обрабатывается автоматически, позволяя этому быть расширенным и законтрактованным по мере необходимости.

, Кроме того, векторы могут обычно содержать любой объект - таким образом, можно сделать класс, чтобы содержать информацию о механизмах и затем сохранить флот в векторе.

Хорошие вещи о векторах, кроме изменения размеров, состоят в том, что они все еще предоставляют доступ в постоянное время к отдельным элементам через индекс, точно так же, как массив.

компромисс для изменения размеров, то, что при ударе токовой нагрузки, она должна перераспределить и иногда копировать в, больше памяти. Однако большинство полных алгоритмов увеличения удваивает способность каждый раз, когда Вы поражаете барьер, таким образом, Вы никогда не поражаете его больше, чем log2 (доступная "куча"), который оказывается, возможно, дюжину раз в худшем случае в течение операции программы.

-Adam

8
задан 3 revs, 2 users 100% 8 October 2009 в 23:27
поделиться

7 ответов

Вы можете рассматривать скалярную переменную как дескриптор файла, открыв ее:

open my $fh, '>', \$variable or die "Can't open variable: $!";
print $fh "Treat this filehandle like any other\n";

Вы даже можете отобразить stdout или stderr в скаляр:

close STDOUT;
open STDOUT, '>', \$variable or die "Can't open STDOUT: $!";

Если вы хотите разделить вывод или настроить файл конфигурации, чтобы делать «интересные» вещи с вашим журналом, вам лучше использовать Log4Perl , как предлагали другие.

19
ответ дан 5 December 2019 в 05:08
поделиться

Вы имеете в виду что-то вроде IO :: Scalar ? Позволяет писать в переменную с семантикой дескриптора файла.

5
ответ дан 5 December 2019 в 05:08
поделиться

Если вы хотите вести выборочное ведение журнала, где вы можете контролировать, какие сообщения регистрируются и где они находятся зарегистрирован, используйте Log :: Log4perl . Это сэкономит вам кучу времени из-за того, что вы возитесь с галстуками и прочей черной магией.

4
ответ дан 5 December 2019 в 05:08
поделиться

Вы можете использовать File :: Tee для разделения дескриптора файла на несколько выходных потоков.

use File::Tee;
open my $fh, '>', 'logfile.txt' or die $!;
tee( $fh, '>', 'otherlogfile.txt' ) if $condition;

print $fh $current_iteration;   # will also go to otherlogfile.txt 
                                # if $condition was true
2
ответ дан 5 December 2019 в 05:08
поделиться

Perlfaq5 рекомендует Tie :: FileHandle :: Multiplex для печати в несколько файлов.

Источник очень прост, и его должно быть легко изменить с помощью фильтра для каждого дескриптора.

2
ответ дан 5 December 2019 в 05:08
поделиться

Похоже, вы хотите привязать дескриптор файла.

my $x;

# printing to $fh will update the variable $x
# when you close $fh, it will print $x to a filehandle depending
# on code in the function  Print_to_variable::CLOSE 

tie $fh, "Print_to_variable", \$x, $output_fh1, $output_fh2;
print $fh "stuff";
print $fh "more stuff";
close $fh;

sub Print_to_variable::TIEHANDLE {
    my ($class, $ref, $fh1, $fh2) = @_;
    my $self = {};
    $self->{ref} = $ref;
    $self->{output_fh1} = $fh1;
    $self->{output_fh2} = $fh2;
    bless $self, "Print_to_variable";
    $self;
}
sub Print_to_variable::PRINT {
    my ($self,@list);
    ${$self->{ref}} .= join "", @list;
}
sub Print_to_variable::CLOSE {
    my $self = shift;
    my $text = ${$self->{ref}};
    if ( &myCondition1($text) ) {    # ... how you decide where to print 
        print {$self->{output_fh1}} $text;
    } else {
        print {$self->{output_fh1}} $text;
    }
}
1
ответ дан 5 December 2019 в 05:08
поделиться

Это потрясающий хак, и я думаю, что решение mobrule или (особенно) решение Синан для Log4Perl - это то, что мне нужно, когда у меня есть время.

Но, это то, что я использую в качестве дополнения:

sub print_to_var($$) {
   my($rx_var, $scalar) = @_;
   $$rx_var .= $scalar;
}


print_to_var \$logvar, $message;

#...later on...
print $somefile $logvar;

Edit:

Так как это вики сообщества, то, что Perl псевдонимы аргументов для функций, ничего не стоит. Это означает, что вы можете просто написать следующее:

sub print_to_var($$) {
   $_[0] .= $_[1];
}

А затем сказать:

my $foo = "OH HAI. ";
print_to_var $foo, "I ARE HELO KITTIE.";
say $foo; # OH HAI.  I ARE HELO KITTIE.

Это не особенно серьезный взлом, хотя print_to_var намного больше печатает, чем . есть.

А вот и HELO KITTIE:

helo kittie http://blogs.philadelphiaweekly.com/style/files/2008/11/hello-kitty-color.gif[1242 visible

1
ответ дан 5 December 2019 в 05:08
поделиться
Другие вопросы по тегам:

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