Slide 1

Slide 1 text

Модульность и повторное использование 1 / 68

Slide 2

Slide 2 text

Как разбить по файлам? 1234 1235 sub deployed_sources 1236 { 1237 my ($self) = @_; 1238 1239 my $deploy_opts = $self->deploy_opts; 1240 1241 return $deploy_opts->{sources} 1242 if exists $deploy_opts->{sources}; 1243 return $deploy_opts->{parser_args}->{sources} 1244 if exists $deploy_opts->{args}->{sources}; 1245 1246 return [ $self->schema->sources ]; 1247 } 1248 2 / 68

Slide 3

Slide 3 text

eval my $u; eval ' $u = 5; my $y = 10; sub m_3 { my ($x) = @_; return $x * 3; } '; $u; # 5 $y; # Undefined m_3(2); # 6 3 / 68

Slide 4

Slide 4 text

do do 'sqr.pl'; # sqr.pl $u = 5; my $y = 10; sub m_3 { my ($x) = @_; return $x * 3; } $u; # 5 $y; # Undefined m_3(2); # 6 4 / 68

Slide 5

Slide 5 text

require require 'sqr.pl'; require Local::Sqr; # Local/Sqr.pm # Local/Sqr.pm $u = 5; my $y = 10; sub m_3 { my ($x) = @_; return $x * 3; } 1; # return value! $u; # 5 $y; # Undefined m_3(2); # 6 5 / 68

Slide 6

Slide 6 text

Файл модуля require Module; # Module.pm require Module::My; # Module/My.pm 6 / 68

Slide 7

Slide 7 text

Поиск модулей perl -e 'print join "\n", @INC' /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl $ PERL5LIB=/tmp/lib perl ... $ perl -I /tmp/lib ... 7 / 68

Slide 8

Slide 8 text

BEGIN BEGIN { require Some::Module; } sub test1 { return 'test1'; sub test2 { return 'test2'; BEGIN {...} } } 8 / 68

Slide 9

Slide 9 text

END open(my $fh, '>', $file); while (1) { # ... } END { close($fh); unlink($file); } 9 / 68

Slide 10

Slide 10 text

Другие блоки CHECK {} UNITCHECK {} INIT {} ${^GLOBAL_PHASE} 10 / 68

Slide 11

Slide 11 text

use Module; use My_module; # My_module.pm use Data::Dumper; # Data/Dumper.pm BEGIN { push(@INC, '/tmp/lib'); } use Local::Module; # Local/Module.pm sub sqr { my ($number) = @_; return $number ** 2; } my $load_time = time(); 1; # return value! 11 / 68

Slide 12

Slide 12 text

Как разбить по файлам? (Итого) eval 'code'; do 'file'; require 'file'; require Module::Name; use Module::Name; 12 / 68

Slide 13

Slide 13 text

Пространства имен? require Some::Module; function(); # ? require Another::Module; another_function(); # ?? require Another::Module2; another_function(); # again!? require Some::Module; Some::Module::function(); require Another::Module; Another::Module::another_function(); require Another::Module2; Another::Module2::another_function(); # np! 13 / 68

Slide 14

Slide 14 text

package package Local::Multiplier; sub m2 { my ($x) = @_; return $x * 2; } sub m3 { my ($x) = @_; return $x * 3; } use Local::Multiplier; print Local::Multiplier::m3(8); # 24 14 / 68

Slide 15

Slide 15 text

package — inline { package Multiplier; sub m_4 { return shift() * 4 } } print Multiplier::m_4(8); # 32 15 / 68

Slide 16

Slide 16 text

our { package Some; my $x = 1; our $y = 2; # $Some::y; our @array = qw(foo bar baz); } print $Some::x; # '' print $Some::y; # '2' print join(' ', @Some::array); # 'foo bar baz' 16 / 68

Slide 17

Slide 17 text

my, state my $x = 4; { my $x = 5; print $x; # 5 } print $x; # 4 use feature 'state'; sub test { state $x = 42; return $x++; } printf( '%d %d %d %d %d', test(), test(), test(), test(), test() ); # 42 43 44 45 46 17 / 68

Slide 18

Slide 18 text

main package our $size = 42; sub print_size { print $main::size; } package Some; main::print_size(); # 42 18 / 68

Slide 19

Slide 19 text

__PACKAGE__ package Some::Module::Lala; print __PACKAGE__; # Some::Module::Lala 19 / 68

Slide 20

Slide 20 text

package VS module require 'Some/Module.pm'; require Some::Module; package Some::Module; # :-O :-( use Some::Module; Some::Another::Module::function(); # surprise! 20 / 68

Slide 21

Slide 21 text

Пространства имен? (Итого) Local/MusicLibrary/Table.pm use Local::MusicLibrary::Table; package use Local::MusicLibrary::Table; 21 / 68

Slide 22

Slide 22 text

Импорт? use Net::FaceBook::Feed::Post; Net::FaceBook::Feed::Post::download('...'); use Net::FaceBook::Feed::Post 'download'; download('...'); using namespace std; cout << endl; from facebook.feed.post import download download('...') 22 / 68

Slide 23

Slide 23 text

use Module LIST; use Local::Module ('param1', 'param2'); use Another::Module qw(param1 param2); BEGIN { require Module; Module->import(LIST); # ~ Module::import('Module', LIST); } use Module (); # BEGIN { require Module; } 23 / 68

Slide 24

Slide 24 text

Пример package My::Package; use File::Path qw(make_path remove_tree); # File::Path::make_path make_path('foo/bar/baz', '/zug/zwang'); File::Path::make_path('...'); My::Package::make_path('...'); # File::Path::remove_tree remove_tree('foo/bar/baz', '/zug/zwang'); File::Path::remove_tree('...'); My::Package::remove_tree('...'); 24 / 68

Slide 25

Slide 25 text

Exporter package Local::Multiplier; use Exporter 'import'; our @EXPORT = qw(m2 m3 m4 m5 m6); sub m2 { shift() ** 2 } sub m3 { shift() ** 3 } sub m4 { shift() ** 4 } sub m5 { shift() ** 5 } sub m6 { shift() ** 6 } use Local::Multiplier; print m3(5); # 125 print Local::Multiplier::m3(5); # 125 25 / 68

Slide 26

Slide 26 text

Exporter — EXPORT_OK package Local::Multiplier; use Exporter 'import'; our @EXPORT_OK = qw(m2 m3 m4 m5 m6); sub m2 { shift() ** 2 } sub m3 { shift() ** 3 } sub m4 { shift() ** 4 } sub m5 { shift() ** 5 } sub m6 { shift() ** 6 } use Local::Multiplier qw(m3); print m3(5); # 125 print Local::Multiplier::m4(5); # 625 26 / 68

Slide 27

Slide 27 text

%EXPORT_TAGS our %EXPORT_TAGS = ( odd => [qw(m3 m5)], even => [qw(m2 m4 m6)], all => [qw(m2 m3 m4 m5 m6)], ); use Local::Multiplier qw(:odd); print m3(5); 27 / 68

Slide 28

Slide 28 text

import() Не зарезервированное слово Не обязан экспортировать функции пакета Не обязан экспортировать в принципе $ perl -e 'Lol->import();' $ perl -e 'Lol->method();' Can't locate object method "method" via package "Lol" (perhaps you forgot to load "Lol"?) at -e line 1. 28 / 68

Slide 29

Slide 29 text

Импорт? (Итого) use Some::Module qw(some_function); some_function('...'); package Some::Module; use Exporter 'import'; our @EXPORT = qw(some_function); sub some_function {} 29 / 68

Slide 30

Slide 30 text

Контроль версий? $ perl -we 'use File::Path qw(make_path);' "make_path" is not exported by the File::Path module Can't continue after import errors at -e line 1. BEGIN failed--compilation aborted at -e line 1. use File::Path 2.00 qw(make_path); 30 / 68

Slide 31

Slide 31 text

use Module VERSION; package Local::Module; our $VERSION = 1.4; use Local::Module 1.5; $ perl -e 'use Data::Dumper 500' Data::Dumper version 500 required-- this is only version 2.130_02 at -e line 1. BEGIN failed--compilation aborted at -e line 1. 31 / 68

Slide 32

Slide 32 text

sub VERSION use Local::Module 500; # Local::Module->VERSION(500); # ~ Local::Module::VERSION('Local::Module', 500); package Local::Module; sub VERSION { my ($package, $version) = @_; # ... } 32 / 68

Slide 33

Slide 33 text

v-strings use Local::Module v5.11.133; v102.111.111; # 'foo' 102.111.111; # 'foo' v1.5; 33 / 68

Slide 34

Slide 34 text

use VERSION; use 5.12.1; use 5.012_001; $^V # v5.12.1 $] # 5.012001 34 / 68

Slide 35

Slide 35 text

Контроль версий? (Итого) use Module v1.1.1; use 5.10; 35 / 68

Slide 36

Slide 36 text

Pragmatic modules use strict; use warnings; 36 / 68

Slide 37

Slide 37 text

use strict 'refs'; use strict 'refs'; $ref = \$foo; print $$ref; # ok $ref = "foo"; print $$ref; # runtime error; normally ok 37 / 68

Slide 38

Slide 38 text

use strict 'vars'; use strict 'vars'; $Module::a; my $x = 4; our $y = 5; 38 / 68

Slide 39

Slide 39 text

use strict 'subs'; use strict 'subs'; print Dumper [test]; # 'test' sub test { return 'str'; } print Dumper [test]; # 'str' 39 / 68

Slide 40

Slide 40 text

use warnings use warings; use warnings 'deprecated'; $ perl -e 'use warnings; print(5+"a")' Argument "a" isn't numeric in addition (+) at -e line 1. $ perl -we 'print(5+"a")' Argument "a" isn't numeric in addition (+) at -e line 1. 40 / 68

Slide 41

Slide 41 text

use diagnostics; use diagnostics; $ perl -e 'use diagnostics; print(5+"a")' Argument "a" isn't numeric in addition (+) at -e line 1 (# (W numeric) The indicated string was fed as an argumen that expected a numeric value instead. If you're fort will identify which operator was so unfortunate. 41 / 68

Slide 42

Slide 42 text

use lib; use lib qw(/tmp/lib); BEGIN { unshift(@INC, '/tmp/lib') } 42 / 68

Slide 43

Slide 43 text

FindBin use FindBin '$Bin'; use lib "$Bin/../lib"; 43 / 68

Slide 44

Slide 44 text

use feautre; use feature qw(say); say 'New line follows this'; 44 / 68

Slide 45

Slide 45 text

use bignum; use bignum; use bigint; use bigrat; $ perl -E 'use bigint; say 500**50' 8881784197001252323389053344726562500000000000000000000000 $ perl -E 'say 500**50' 8.88178419700125e+134 45 / 68

Slide 46

Slide 46 text

Pragmatic modules (Итого) package Some::Module; use strict; use warnings; 1; 46 / 68

Slide 47

Slide 47 text

no no Local::Module LIST; # Local::Module->unimport(LIST); no 5.010; no strict; no feature; 47 / 68

Slide 48

Slide 48 text

Как работает экспорт? Как копируются функции? Как Exporter узнает, куда их копировать? 48 / 68

Slide 49

Slide 49 text

Symbol Tables { package Some::Package; our $var = 500; our @var = (1,2,3); our %func = (1 => 2, 3 => 4); sub func { return 400 } } use Data::Dumper; print Dumper \%Some::Package::; $VAR1 = { 'var' => *Some::Package::var, 'func' => *Some::Package::func }; 49 / 68

Slide 50

Slide 50 text

Typeglob +------> SCALAR - $bar | +------> ARRAY - @bar | +------> HASH - %bar | Foo:: -----> bar -----+------> CODE - &bar | +------> IO - bar (FH) | +------> GLOB - *bar 50 / 68

Slide 51

Slide 51 text

Typeglob — операции *Some::Package::foo = *Some::Package::var; *Some::Package::foo = \$bar; *Some::Package::foo = \@bar; *Some::Package::func = sub { ... } *Some::Package::func = \&Another::Package::func; 51 / 68

Slide 52

Slide 52 text

caller() # 0 1 2 ($package, $filename, $line) = caller(); ( $package, $filename, $line, $subroutine, $hasargs, $wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash ) = caller($i); 52 / 68

Slide 53

Slide 53 text

Как работает экспорт? (Итого) Как копируются функции? — Таблица символов. Как Exporter узнает, куда их копировать? — caller() 53 / 68

Slide 54

Slide 54 text

local { package Test; our $x = 123; sub bark { print $x } } Test::bark(); # 123 { local $Test::x = 321; Test::bark(); # 321 } Test::bark(); # 123 54 / 68

Slide 55

Slide 55 text

local — варианты # localization of values local $foo; local (@wid, %get); local $foo = "flurp"; local @oof = @bar; local $hash{key} = "val"; delete local $hash{key}; local ($cond ? $v1 : $v2); # localization of symbols local *FH; local *merlyn = *randal; local *merlyn = 'randal'; local *merlyn = \$randal; 55 / 68

Slide 56

Slide 56 text

CPAN The Comprehensive Perl Archive Network http://cpan.org 56 / 68

Slide 57

Slide 57 text

Metacpan http://metacpan.org 57 / 68

Slide 58

Slide 58 text

Установка из пакета в Debian $ apt-cache search libjson-perl libjson-perl - module for manipulating JSON-formatted data libjson-pp-perl - module for manipulating JSON-formatted data (Pure Perl) libjson-xs-perl - module for manipulating JSON-formatted data (C/XS-accelerated) # apt-get install libjson-perl 58 / 68

Slide 59

Slide 59 text

Установка из пакета в CentOS $ yum search perl-json ======================== Matched: perl-json ============= perl-JSON-XS.x86_64 : JSON serialising/deserialising, done correctly and fast perl-JSON.noarch : Parse and convert to JSON (JavaScript Object Notation) perl-JSON-PP.noarch : JSON::XS compatible pure-Perl modul $ yum install perl-JSON-XS 59 / 68

Slide 60

Slide 60 text

Утилита cpan $ cpan Terminal does not support AddHistory. cpan shell -- CPAN exploration and modules installation ( Enter 'h' for help. $ cpan install JSON perl -MCPAN -e shell 60 / 68

Slide 61

Slide 61 text

Утилита cpanm curl -L https://cpanmin.us | \ perl - --sudo App::cpanminus cpanm Data::Printer cpanm MIYAGAWA/Plack-0.99_05.tar.gz cpanm ~/dists/MyCompany-Enterprise-1.00.tar.gz 61 / 68

Slide 62

Slide 62 text

cpantesters 62 / 68

Slide 63

Slide 63 text

module-starter module-starter --module Local::PerlCourse --author Vadim --email [email protected] $ tree Local-PerlCourse/ Local-PerlCourse/ ├── Changes ├── ignore.txt ├── lib │ └── Local │ └── PerlCourse.pm ├── Makefile.PL ├── MANIFEST ├── README └── t ├── 00-load.t ├── boilerplate.t ├── manifest.t ├── pod-coverage.t └── pod.t 63 / 68

Slide 64

Slide 64 text

ExtUtils::MakeMaker use 5.006; use strict; use warnings; use ExtUtils::MakeMaker; WriteMakefile( NAME => 'Local::PerlCourse', AUTHOR => q{Vadim }, VERSION_FROM => 'lib/Local/PerlCourse.pm' ABSTRACT_FROM => 'lib/Local/PerlCourse.pm' ($ExtUtils::MakeMaker::VERSION >= 6.3002 ? ('LICENSE'=> 'perl') : ()), PL_FILES => {}, PREREQ_PM => { 'Test::More' => 0, }, dist => { COMPRESS => 'gzip -9f', SUFF clean => { FILES => 'Local-PerlCourse-* ); 64 / 68

Slide 65

Slide 65 text

Module::Install use inc::Module::Install; # Define metadata name 'Your-Module'; all_from 'lib/Your/Module.pm'; # Specific dependencies requires 'File::Spec' => '0.80'; test_requires 'Test::More' => '0.42'; recommends 'Text::CSV_XS'=> '0.50'; no_index 'directory' => 'demos'; install_script 'myscript'; WriteAll; 65 / 68

Slide 66

Slide 66 text

Module::Build use Module::Build; my $build = Module::Build->new( module_name => 'Foo::Bar', license => 'perl', requires => { 'perl' => '5.6.1', 'Some::Module' => '1.23', 'Other::Module' => '>= 1.2, != 1.5, < 2.0', }, ); $build->create_build_script; perl Build.PL ./Build ./Build test ./Build install 66 / 68

Slide 67

Slide 67 text

ДЗ 3.1 Упражнение, баллов не дает homeworks/getset package Local::SomePackage; use Local::GetterSetter qw(x y); # scalar only set_x(50); $Local::SomePackage::x; # 50 our $y = 42; get_y(); # 42 set_y(11); get_y(); # 11 67 / 68

Slide 68

Slide 68 text

ДЗ 3.2 8 баллов homeworks/music_library ./Midas Fall/2015 - The Menagerie Inside/Low.ogg ./Midas Fall/2015 - The Menagerie Inside/Holes.ogg ./Midas Fall/2015 - The Menagerie Inside/Push.ogg /--------------------------\ | Midas Fall | Low | ogg | |------------+-------+-----| | Midas Fall | Holes | ogg | |------------+-------+-----| | Midas Fall | Push | ogg | \--------------------------/ 68 / 68