Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Хранение информации внутри скрипта


Автор: Suppir 2.10.2010, 19:07
Добрый день!


Иногда использую конструкцию __DATA__ для хранения описания программы внутри pl-скрипта.
Также использую while(<DATA>) для чтения оттуда информации.
А можно ли прочитать в переменную не только данные после __DATA__, но и весь текст pl-скрипта?

Автор: sir_nuf_nuf 2.10.2010, 19:32
Нет, то что находится в data исполняться не будет.

Правда туда можно запихнать почти весь Perl скрипт
Код

#!/usr/bin/perl
eval do { local $/ = undef; <DATA> };
__DATA__
use warnings;
use strcit;

.....


Автор: Suppir 2.10.2010, 19:57
Спасибо, попробую!

Автор: korob2001 2.10.2010, 20:49
Можно открыть самого себя и прочитать:
Код

#!/usr/bin/perl -w
use strict;

my $it_me;
open my $fh, "<", $0 or die $!;
$it_me = join("", <$fh>);
close($fh);

print $it_me;

Автор: Suppir 2.10.2010, 20:58
Это уже метапрограммирование какое-то smile Интересно, какие фишки с метапрограммированием возможны (и полезны) в Perl?

Автор: gcc 2.10.2010, 23:05
можно поставить в скрипте в самом низу __DATA__

Код

 # вся  <DATA>, $pos - последнее значение
   $pos = do { chomp; $_ } while <DATA>;

........
   # добавить $pos в конец __DATA__  (автор: amg)
    exec qw(perl -0777 -i -pe), 's/$/\n' . $pos . '/', $0;
...........

$pidfile->remove;        #or warn "Couldn't unlink pid file\n";
exit;

__DATA__
137093
137093
140468
141590
142712


Добавлено @ 23:08
Цитата(Suppir @ 2.10.2010,  20:58)
Это уже метапрограммирование какое-то smile Интересно, какие фишки с метапрограммированием возможны (и полезны) в Perl?

http://search.cpan.org/search?query=moose+meta&mode=all

и eval может подгрузить сгенерированный код...

Автор: KSURi 5.10.2010, 19:08
Есть такая хитрая конструкция:
Код

#!/usr/bin/env perl

seek DATA, 0, 0;
my $code = do { local $/; <DATA> };

__DATA__

Автор: gcc 8.10.2010, 12:05
кстате, еще можно сделать русский perl и распарсить? (и название переменных и т.д. в том числе)

только что пример сочинил, работает smile

Код

$i = 5;
печатаем "666" если ($i>4);


Код

#!/usr/bin/perl


sub open_data {
    my $handle = shift;
    local $/ = '';    # Включить режим чтения абзацев
    return <$handle>;
}


sub rus {

 for (@_[0]) {
    s{печатаем}{print}ig; 
    s{если}{if}ig;
 }
 return @_[0];
}


eval rus open_data(*DATA);

die "Exception error: $!" if $@;

# real code:
__DATA__

$i = 5;
печатаем "666" если ($i>4);


Автор: Suppir 8.10.2010, 15:47
gcc, надо бы тогда и переменные в кириллице писать smile
говорят, что  в Perl 6 можно любыми юникодовыми символами называть, даже иероглифами smile

Автор: KSURi 8.10.2010, 17:31
Код

$ cat t.pl
#!/usr/bin/env perl

use utf8;

my $переменная = функция();
print $переменная;

sub функция {
    my $один = 1;
    my $два  = 2;

    $один + $два;
}
$ perl -l t.pl
3

Автор: Suppir 8.10.2010, 20:17
Прикольно smile Везет же американцем, они всё пишут на родном языке.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)