SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
Perl5 Memory Manglement

              Does size Really Matter?


Steven Lembark  
Workhorse Computing
lembark@wrkhors.com
©2009 Steven Lembark
WARNING!

The following material contains
        explicit Perl Guts.

  Viewer derision is advised.
Why you care
●
    Long lived, high­volume, or high­speed app's 
    need to avoid swapping, heap fragmentation, or 
    blowing ulimits.
●
    Examples are ETL, Bioinformatics, or long­lived 
    servers.
●
    Non­examples are JAPH or WWW::Mechanize 
    jobs that snag one page.
PerlGuts & Perl Data Intro
●
    The standard introduction to Perl's guts is 
    “perlguts” (use perldoc or view it as HTML on 
    CPAN).
●
    Perldoc also includes “perldebuguts” which 
    shows how to use the debugger to look around 
    for yourself.
●
    Simeon Cozens' Intro to Perl5 Internals is 
    avaialable online at:

    http://www.faqs.org/docs/perl5int/
Space vs. Speed
●
    Speed is fun, but is comes at a price.
●
    The usual tradeoff in computing is space: faster 
    is bigger.
●
    Perl is simple: it always favors speed.
●
    As the programmer you have to manage the 
    space.
A view from perldebuguts
Perl is a profligate wastrel when it comes to memory use. There is a 
saying that to estimate memory usage of Perl, assume a reasonable 
algorithm for memory allocation, multiply that estimate by 10, and 
while you still may miss the mark, at least you won't be quite so 
astonished. This is not absolutely true, but may provide a good grasp 
of what happens.

Anecdotal estimates of source­to­compiled code bloat suggest an 
eightfold increase. This means that the compiled form of reasonable 
(normally commented, properly indented etc.) code will take about 
eight times more space in memory than the code took on disk. 
Perly Memory
●
    Perl's model is similar to C:
    ●
        subroutine calls have a “scratchpad” (“PAD”) that 
        works like C's stack and a heap for permenant 
        allocations.
    ●
        lexical variables live in the pad but are allocated on 
        the heap.
●
    Perl's heap is expanded to meet new allocation 
    requests, it does not shrink.
Perl5 Peep Show
●
    Devel::Peek displays internals.
    ●
        Quite handy when used with the Perl debugger: you 
        can set things and eyeball the consequences easily.
●
    Devel::Size shows the size of a structure alone 
    or with its contents.
●
    Both can be added to #! code or modules.
A View from the Perly Side
●
    Most of us use scalars, arrays, and hashes. 
●
    Scalars do all the work of simple data types in C 
    and are managed in the Perl code via “SV” 
    structures (leaving out Magic).
●
    Arrays are lists of scalars.
●
    Hashes are arrays of arrays.
“length” vs “structure”
●
    Most people think of “size” as data:
    ●   length $string;
    ●   scalar @array;
●
    This leaves out the structure of the variable 
    itself. 
●
    Devel::Size uses “size” for the structure, 
    “total_size” for the size + contained data.
Scalars: “SV”
●
    Because SV's can handle text, numeric, and 
    pointer values their perlguts are fairly detailed. 
●
    Strings are interesting for memory issues:
    ●
        They can grow depending on what they store.
    ●
        peek and size give a way to look at the space they 
        take up.
Text 
●
    Strings are allocated as C­style strings, with a 
    list of characters followed by a NUL.
●
    They can grow by being extended or re­
    allocated.
●
    Removing a characters from a string moves a 
    'start of string' pointer in the SV or reduces the 
    length counter (or both).
●
    Note that the structure does not shrink.
Aside: NULL vs NUL
●
    NUL is an ACSII character with all zero bits used 
    to terminate strings in C.
●
    NULL is a pointer value that will never compare 
    true to a valid pointer.
    ●
        It is used to check whether memory is allocated.
    ●
        It may not be zero.
    ●
        It is not used to terminate strings.
Examples
●
    Much of what follows are examples of using 
    Devel::* modules to examine structures.
●
    I've done them in the Perl debugger, showing 
    the debug commands. 
●
    Hopefully this will make it easier to replicate 
    these tests on your code. 
$ perl ­MDevel::Peek ­MDevel::Size=size ­d ­e 42;

DB<1> $a = ''
DB<2> Dump $a

  SV = PV(0x8371fd8) at 0x82035d8
    REFCNT = 2            $a upped the ref count
    PV = 0x834a550 ""0   Notice trailing NUL
    CUR = 0               0 offset to end


Using Devel::Size to look at the same variable, the empty string has a
36­byte memory footprint:
DB<3> p size $a;
36                     Even the empty string
                       takes up space.
Assigning a string to the variable allocates more space:
DB<4> $a = 'a' x 8
DB<5> Dump $a

  SV = PV(0x8371fd8) at 0x82035d8

    PV = 0x834a550 "aaaaaaaa"0
    CUR = 8     8 char's of data


The size goes from 36 ­> 44 bytes with the addition of 8 chars:
DB<6> p size $a
44
Removing a leading character does not free up any space.
The offset is increased by one, ignoring one character ( “x” . ):
DB<7> substr $a, 0, 1, ''
DB<8> Dump $a
DB<9>

  SV = PVIV(0x804e240) at 0x82035d8

    IV = 1  (OFFSET)              offset to start
    PV = 0x834a551 ( "x" . ) "aaaaaaa"0
    CUR = 7                       length $a


<10> p total_size $a
48                        No change in size!
Try this a few more times and you end up with an offset of 8: 7 unused 
chars, and a single character returned in the string. The SV still contains 
the full 8 char's, but only one of them is used from perl in $a.
  IV = 8  (OFFSET)
  PV = 0x834a558 ( "xxxxxxxx" . ) "x"0
  CUR = 1


And the variable's size has not changed:
DB<12> p total_size $a
48
Splicing off the end of a string does not re­allocate the memory: the NUL 
is moved down, but the allocated size does not change:
DB<40> $a = 'a' x 8

DB<41> Dump $a
SV = PV(0x8372b70) at 0x82028b0
  PV = 0x834b198 "aaaaaaaa"0
  CUR = 8

DB<42> substr $a, 1, length $a, '';
DB<43> Dump $a

SV = PV(0x8372b70) at 0x82028b0
  PV = 0x834b198 "a"0
  CUR = 1

DB<43> p total_size $a
48
In fact, there isn't anything you can do to reduce the string within an SV:
DB<58> $f = ''
DB<59> p total_size $f
36
DB<60> $f = 'x' x 1024
DB<61> p total_size $f
1060
DB<62> substr $f, 512, 512, '' half of it is empty
DB<63> p total_size $f
1060                          
DB<64> $f = ''                all of it is empty
DB<65> p total_size $f
1060

This can be useful in cases where you have to re­allocate a large string: just 
allocate a single variable once and use it as a buffer. Just don't expect to 
chew through parts of a string from either end and recover the space. 
The way to shorten the string is assign it by value:
DB<66> $i = 'x' x 1024
DB<67> substr $i, 512, 512, ''
DB<68> $j = $i
DB<69> p total_size $i
1060
DB<70> p total_size $j
548

For example, read into a fixed buffer then assign the scrubbed result:
 
my $buffer= '';
while( $buffer = <$in> )
{
   # mangle the buffer as necessary, then assign it:
   my $line = $buffer;
  ...
Takeaway
●
    Strings don't shrink.
●
    Use lexical variables to return memory.
●
    Clean variables up before assigning them:
      my $buffer    = <$fh>;
      $buffer    =~ s{ $rx }{}gx;
      $data{ $key } = $buffer;
Arrays are similar to text
●
    They are reduced by adding a skip count to the 
    array and reducing the length.
●
    This can lead to all sorts of confusion if you try 
    to 'free up space' by shifting data off of an array.
Even an empty array takes up space:
DB<14> @a = ()
DB<15> Dump @a

  SV = PVAV(0x8386a08) at 0x8325d68

    ARRAY = 0x0
    FILL = ­1
    MAX = ­1
    ARYLEN = 0x0           OK, it's empty...


DB<17> p total_size @a
100                                   ... but it still
                                         takes up space
Adding entries changes the count:
DB<16> @a = ('a'.. 'h' );
DB<17> Dump @a

    ARRAY = 0x838ae00
    FILL = 7
    MAX = 7
    ARYLEN = 0x0
    SV = PV(0x8371fe8) at 0x8388fa8    Stringy SV...
      REFCNT = 1
      FLAGS = (POK,pPOK)
      PV = 0x8379340 "a"0            With an 'a' and NUL...
      CUR = 1
      LEN = 4
    Elt No. 1
    SV = PV(0x8371f28) at 0x8389258   And another SV

DB<18> p total_size @z
420                               about 50 bytes/entry
Splicing changes the counts:
DB<18> splice @a, 0, 7, ();
DB<19> Dump @a

    ARRAY = 0x838ae1c (offset=7)  offset, like strings
    ALLOC = 0x838ae00
    FILL = 0
    MAX = 0
    ARYLEN = 0x0
    FLAGS = (REAL)
    Elt No. 0
    SV = PV(0x80ab908) at 0x838e2e0
      REFCNT = 1
      FLAGS = (POK,pPOK)
      PV = 0x837b5d0 "a"0
Assigning to $#array works like splice or pop: it changes the length, 
not the size:

DB<6> @a = ( 1 .. 1_000_000 )

DB<7> DB<7> x size @a
0  4000100

DB<8> $#a = ­1

DB<9> x size @a
0  4000200

DB<10> x scalar @a
0  0
Assigning to a new variable by value only copies the “active” contents of 
the array – both its length and the strings copied to the new array:
DB<82> @z = ()
DB<84> p total_size @z
132                                  empty array
DB<85> @z = ( 'z' ) x 1024
DB<86> p total_size @z
45140                                    1024 text SV's
DB<87> splice @z, 512, 512, ()
DB<88> p total_size @z
26708                                only 512 text SV's
DB<89> splice @z, 0, 512, ()
DB<90> p total_size @z
8276                                     empty again
DB<90> @y = @z
DB<91> p total_size @y
100                                  new var is empty
What about about queues?
●
    A classic arrangement is to shift work off the 
    front, pushing new tasks onto the array.
●
    Which works fine, but doesn't do anything to 
    recover any space.
●
    New items are pushed onto the end, regardless 
    of unused initial space.
Net result: shift+push on a non­empty array leaves you with a larger array.
  DB<11> p total_size @a
340

 DB<12> shift @a;

 DB<13> p total_size @a
304

 DB<14> push @a, 'z'

 DB<15> p total_size @a
364
Arrays grow in chunks in order to avoid growing multiple times:

DB<1> @a = ()
DB<2> p size @a
100

DB<3> @a = ( 'a' .. 'z' )
DB<4> p size @a              Empty array.
204
DB<5> p total_size @a
1104

DB<6> push @a, '1'
DB<7> p size @a
340                           char + NUL + 40 bytes of structure.
DB<8> p total_size @a
1276

DB<9> push @a, '2'
DB<10> p size @a
340

                              Growth in chunks...


                              ... avoids growing many times.
Big Arrays: Big Leaps
●
    This has a big effect arrays that result from 
    “slurp” reads.
●
    If you cannot control the initial size, be careful 
    about what you do afterward: the results can 
    grow more than you expect!
    DB<30> @d = ( 1 .. 1_000_000 )

    DB<31> p size @d
    4000100

    DB<34> push @d, 1
    DB<35> p size @d
    8388692
Order Matters
●
    There are four ways to keep a constant queue – 
    say for a moving average:
    ●
        shift + push
    ●
        push + shift
    ●
        pop + unshift
    ●
        unshift + pop
●
    Q:Which of these results in the least size?
After 20 operations:
push + shift is half the size

  Operation            Before After 
                 Count  Size  Size 
  @push_shift  :   100   500    596  
  @shift_push  :   100   500    1108
  @unshift_pop :   100   500    1108
  @pop_unshift :   100   500    1108
Random trial
●
    Randomly push or pop from a list, tracking the 
    maximum array length (scalar @array), 
    maximum and final size.
●
    This is similar to what happens in a normal 
    work queue: jobs arrive asynchronously and are 
    serviced in FIFO order.
Results: Random Push or Pop
 Length   Final
Max Final Size

20    6    212    After 1_000 iterations of random push or pop:
25   10    212
25    9    212    ( 0.50 < rand ) ? pop @a : push @a, 1;
26   14    212
26   21    212
27   23    212    Final length does not determine final size: the maximum 
28   17    212    length does: the shortest final length (4) has a larger size 
29   21    340
31   18    340
                  than all of the arrays with the smallest final size.
33   31    340
35   27    340
35    4    340
35    7    340
40   13    340
43   34    340
43   43    340
45   39    340
51   40    340
78   48    596
83   61    596
Takeaway
●
    Like strings:
    ●
        Arrays don't shrink.
    ●
        Lexicals return their space.
●
    You can recover space from values stored in the 
    array, but the SA structure itself only grows.
●
    For cyclic use, clean up a buffer first and then 
    assign it to a new variable (just like strings).
Hashes
●
    Hashes are composed of a bucket list and 
    collision chains of arrays (array of arrays.
●
    You get 8 collision chains (“buckets”) with 
    the hash structure, even if it is empty.
●
    Within a chain, searches are linear.
Empty hashes are larger than empty arrays:
DB<20> %a = ()
DB<21> Dump %a

  SV = PVHV(0x82dda9c) at 0x8325340
    FLAGS = (SHAREKEYS)
    ARRAY = 0x0
    KEYS = 0
    FILL = 0
    MAX = 7
    RITER = ­1
    EITER = 0x0

DB<22> p total_size %a
76
DB<22> @a{ ('a' .. 'z' ) } = ()
DB<23> Dump %a

    FLAGS = (OOK,SHAREKEYS)
    ARRAY = 0x838a8e8  (0:13, 1:12, 2:7) bucket use: 13 w/0, 12 w/1, 7 w/ 2
    hash quality = 115.8%                     uneven distribution
    KEYS = 26                                 keys in use
    FILL = 19                                 buckets filled (12 + 7)
    MAX = 31
    RITER = ­1
    EITER = 0x0
    Elt "w" HASH = 0x58a0b120            collision chain is an array
    SV = NULL(0x0) at 0x838e5a0         
      REFCNT = 1
    Elt "r" HASH = 0x26014be2
    SV = NULL(0x0) at 0x838e4d0
      REFCNT = 1
      FLAGS = ()
    Elt "a" HASH = 0xca2e9442
    SV = NULL(0x0) at 0x83890f8
      REFCNT = 1
      FLAGS = ()
DB<24> p total_size %a
1186                                               Keys only! ~ 45bytes/letter
DB<99> delete @a{ 'a' .. 'm' }
DB<100> Dump %a

    ARRAY = 0x840a638  (0:19, 1:13) 31 buckets, 19 empty
    hash quality = 175.0%
    KEYS = 13
    FILL = 13
    MAX = 31
 
    Elt "w" HASH = 0x58a0b120
    SV = NULL(0x0) at 0x83ee3d8
      REFCNT = 1
    Elt "r" HASH = 0x26014be2

DB<101> p total_size %a      the SV's used for keys
679                           go away, but the final  
DB<102> %a = ()               size is still larger
DB<103> p total_size %a   than the original hash.
172                               incl. arrays for chains.
Takeaway
●
    Hashes are bigger than arrays.
●
    Deleting keys from the hash does not reduce the 
    structure.
●
    Even assigning @a = () or %a = () does not 
    reduce the structure.
●
    Collision chains are arrays: they don't shrink!
What can you do about it?
●
    Buffer inputs, clean them up then assign  by 
    value: recycling the variable saves time re­
    allocating it, copying the cleaned up copy saves 
    space:
        my $buffer = <$read>;
        # chomp, clean out witespace, then.
        push @linz, $buffer;
    ●
        Same with hashes and arrays: recycle static variables 
        for input and assign them to lexicals for use.
●
    Generate structures before you fork: at least the 
    read­only portion will be shared.
Pre­size Buffers
●
    Say you regularly read a million­line file and 
    don't want it to use two­million array entries:
      my @buffer   = ();
      $#buffer     = 1_001_000;
      $#buffer     = -1;
●
    This will give you 1001 offsets of wiggle room 
    before you end up doubling the array size.
●
    Avoiding re­allocation as the array grows also 
    helps speed.
Use arrays instead of hashes
●
    Store a tree as $tree{ parent } => @children 
    instead of $tree{ $parent }{ $child } = 1 or 
    $tree{ $parent1 }{ $parent2 }{ $child } = ().
●
    Avoid $tree{ $child }{ $parent} with only one 
    entry per child.
●
    Store smaller lists as arrays and just search them 
    with List::Util::first or smart­match (~~):
      my $found = first{ $_ eq $value } @array;
      $value ~~ @array or die “Unknown: '$value'”;
Manage Scope
●
    Lexicals flag their space as re­usable when the 
    go out of scope:
    ●
        Put buffer variables inside the subroutines:
          sub read_log
          {
              my $buffer = ' ' x 120;
              ...
    ●
        Or inside the loops that use them:
          while( my $line = <$input> )


●
    Use “undef” to control the scope of data.
undef: Speed vs. Space
●
    “undef” releases memory.
    ●
        This empties a scalar, array, or hash variable: the 
        contents are not shortened, they are discarded.
    ●
        This requires re­allocating SV space if the variable is 
        used again: gives you control space/speed tradeoff.
●
    Use with if­logic to manage pre­sized buffers:
        if( $buff_presize < @buffer )
        {
            undef @buffer;
            $#buffer = $buff_presize;
            $#buffer = ­1;
        }
Summary
●
    Perly structures trade space for speed.
●
    Structures can grow in non­obvious ways.
●
    Strings, arrays, and hashes are not reduced by 
    substr, splice, delete.
●
    undef discards contents, it does not resize them.
●
    Devel::Peek and Devel::Size give you a way to 
    benchmark and validate your results.
●
    And, yes, size() really matters.

Contenu connexe

Tendances

Lecture 22
Lecture 22Lecture 22
Lecture 22
rhshriva
 
CS225_Prelecture_Notes 2nd
CS225_Prelecture_Notes 2ndCS225_Prelecture_Notes 2nd
CS225_Prelecture_Notes 2nd
Edward Chen
 
Declarative Type System Specification with Statix
Declarative Type System Specification with StatixDeclarative Type System Specification with Statix
Declarative Type System Specification with Statix
Eelco Visser
 

Tendances (20)

Functions
FunctionsFunctions
Functions
 
What's New in C++ 11?
What's New in C++ 11?What's New in C++ 11?
What's New in C++ 11?
 
Chap03[1]
Chap03[1]Chap03[1]
Chap03[1]
 
Programming Assignment Help
Programming Assignment HelpProgramming Assignment Help
Programming Assignment Help
 
POLITEKNIK MALAYSIA
POLITEKNIK MALAYSIAPOLITEKNIK MALAYSIA
POLITEKNIK MALAYSIA
 
[ASM]Lab8
[ASM]Lab8[ASM]Lab8
[ASM]Lab8
 
Ddl
DdlDdl
Ddl
 
Creating Domain Specific Languages in Python
Creating Domain Specific Languages in PythonCreating Domain Specific Languages in Python
Creating Domain Specific Languages in Python
 
C++ theory
C++ theoryC++ theory
C++ theory
 
Strings in c++
Strings in c++Strings in c++
Strings in c++
 
Lecture 22
Lecture 22Lecture 22
Lecture 22
 
CS225_Prelecture_Notes 2nd
CS225_Prelecture_Notes 2ndCS225_Prelecture_Notes 2nd
CS225_Prelecture_Notes 2nd
 
Generating parsers using Ragel and Lemon
Generating parsers using Ragel and LemonGenerating parsers using Ragel and Lemon
Generating parsers using Ragel and Lemon
 
Jekyll - Liquid for noobs
Jekyll - Liquid for noobsJekyll - Liquid for noobs
Jekyll - Liquid for noobs
 
Declarative Type System Specification with Statix
Declarative Type System Specification with StatixDeclarative Type System Specification with Statix
Declarative Type System Specification with Statix
 
Open Gurukul Language PL/SQL
Open Gurukul Language PL/SQLOpen Gurukul Language PL/SQL
Open Gurukul Language PL/SQL
 
strings
stringsstrings
strings
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Python
 
Learning sed and awk
Learning sed and awkLearning sed and awk
Learning sed and awk
 
Computer Programming- Lecture 5
Computer Programming- Lecture 5 Computer Programming- Lecture 5
Computer Programming- Lecture 5
 

En vedette

En vedette (7)

Signal Stacktrace
Signal StacktraceSignal Stacktrace
Signal Stacktrace
 
Memory unmanglement
Memory unmanglementMemory unmanglement
Memory unmanglement
 
Lies, Damn Lies, and Benchmarks
Lies, Damn Lies, and BenchmarksLies, Damn Lies, and Benchmarks
Lies, Damn Lies, and Benchmarks
 
Getting testy with Perl
Getting testy with PerlGetting testy with Perl
Getting testy with Perl
 
Paranormal stats
Paranormal statsParanormal stats
Paranormal stats
 
Selenium sandwich-3: Being where you aren't.
Selenium sandwich-3: Being where you aren't.Selenium sandwich-3: Being where you aren't.
Selenium sandwich-3: Being where you aren't.
 
Selenium sandwich-2
Selenium sandwich-2Selenium sandwich-2
Selenium sandwich-2
 

Similaire à Perl5 Memory Manglement

EMBEDDED SYSTEMS 4&5
EMBEDDED SYSTEMS 4&5EMBEDDED SYSTEMS 4&5
EMBEDDED SYSTEMS 4&5
PRADEEP
 
Optimizing Tcl Bytecode
Optimizing Tcl BytecodeOptimizing Tcl Bytecode
Optimizing Tcl Bytecode
Donal Fellows
 
Session 2 - Objective-C basics
Session 2 - Objective-C basicsSession 2 - Objective-C basics
Session 2 - Objective-C basics
Vu Tran Lam
 
Advanced perl finer points ,pack&amp;unpack,eval,files
Advanced perl   finer points ,pack&amp;unpack,eval,filesAdvanced perl   finer points ,pack&amp;unpack,eval,files
Advanced perl finer points ,pack&amp;unpack,eval,files
Shankar D
 

Similaire à Perl5 Memory Manglement (20)

Cs3430 lecture 15
Cs3430 lecture 15Cs3430 lecture 15
Cs3430 lecture 15
 
Perly Parallel Processing of Fixed Width Data Records
Perly Parallel Processing of Fixed Width Data RecordsPerly Parallel Processing of Fixed Width Data Records
Perly Parallel Processing of Fixed Width Data Records
 
Getting started with Perl XS and Inline::C
Getting started with Perl XS and Inline::CGetting started with Perl XS and Inline::C
Getting started with Perl XS and Inline::C
 
BITS: Introduction to relational databases and MySQL - Schema design
BITS: Introduction to relational databases and MySQL - Schema designBITS: Introduction to relational databases and MySQL - Schema design
BITS: Introduction to relational databases and MySQL - Schema design
 
Our Friends the Utils: A highway traveled by wheels we didn't re-invent.
Our Friends the Utils: A highway traveled by wheels we didn't re-invent. Our Friends the Utils: A highway traveled by wheels we didn't re-invent.
Our Friends the Utils: A highway traveled by wheels we didn't re-invent.
 
Perl at SkyCon'12
Perl at SkyCon'12Perl at SkyCon'12
Perl at SkyCon'12
 
Short Introduction To "perl -d"
Short Introduction To "perl -d"Short Introduction To "perl -d"
Short Introduction To "perl -d"
 
An Overview of SystemVerilog for Design and Verification
An Overview of SystemVerilog  for Design and VerificationAn Overview of SystemVerilog  for Design and Verification
An Overview of SystemVerilog for Design and Verification
 
Arrays and lists in sql server 2008
Arrays and lists in sql server 2008Arrays and lists in sql server 2008
Arrays and lists in sql server 2008
 
EMBEDDED SYSTEMS 4&5
EMBEDDED SYSTEMS 4&5EMBEDDED SYSTEMS 4&5
EMBEDDED SYSTEMS 4&5
 
Optimizing Tcl Bytecode
Optimizing Tcl BytecodeOptimizing Tcl Bytecode
Optimizing Tcl Bytecode
 
Verilog
VerilogVerilog
Verilog
 
C tour Unix
C tour UnixC tour Unix
C tour Unix
 
Advanced MySQL Query Optimizations
Advanced MySQL Query OptimizationsAdvanced MySQL Query Optimizations
Advanced MySQL Query Optimizations
 
Session 2 - Objective-C basics
Session 2 - Objective-C basicsSession 2 - Objective-C basics
Session 2 - Objective-C basics
 
plsql.ppt
plsql.pptplsql.ppt
plsql.ppt
 
Perl Basics with Examples
Perl Basics with ExamplesPerl Basics with Examples
Perl Basics with Examples
 
Advanced perl finer points ,pack&amp;unpack,eval,files
Advanced perl   finer points ,pack&amp;unpack,eval,filesAdvanced perl   finer points ,pack&amp;unpack,eval,files
Advanced perl finer points ,pack&amp;unpack,eval,files
 
pm1
pm1pm1
pm1
 
Porting Applications From Oracle To PostgreSQL
Porting Applications From Oracle To PostgreSQLPorting Applications From Oracle To PostgreSQL
Porting Applications From Oracle To PostgreSQL
 

Plus de Workhorse Computing

Plus de Workhorse Computing (20)

Wheels we didn't re-invent: Perl's Utility Modules
Wheels we didn't re-invent: Perl's Utility ModulesWheels we didn't re-invent: Perl's Utility Modules
Wheels we didn't re-invent: Perl's Utility Modules
 
mro-every.pdf
mro-every.pdfmro-every.pdf
mro-every.pdf
 
Paranormal statistics: Counting What Doesn't Add Up
Paranormal statistics: Counting What Doesn't Add UpParanormal statistics: Counting What Doesn't Add Up
Paranormal statistics: Counting What Doesn't Add Up
 
The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.The $path to knowledge: What little it take to unit-test Perl.
The $path to knowledge: What little it take to unit-test Perl.
 
Unit Testing Lots of Perl
Unit Testing Lots of PerlUnit Testing Lots of Perl
Unit Testing Lots of Perl
 
Generating & Querying Calendar Tables in Posgresql
Generating & Querying Calendar Tables in PosgresqlGenerating & Querying Calendar Tables in Posgresql
Generating & Querying Calendar Tables in Posgresql
 
Hypers and Gathers and Takes! Oh my!
Hypers and Gathers and Takes! Oh my!Hypers and Gathers and Takes! Oh my!
Hypers and Gathers and Takes! Oh my!
 
BSDM with BASH: Command Interpolation
BSDM with BASH: Command InterpolationBSDM with BASH: Command Interpolation
BSDM with BASH: Command Interpolation
 
Findbin libs
Findbin libsFindbin libs
Findbin libs
 
Memory Manglement in Raku
Memory Manglement in RakuMemory Manglement in Raku
Memory Manglement in Raku
 
BASH Variables Part 1: Basic Interpolation
BASH Variables Part 1: Basic InterpolationBASH Variables Part 1: Basic Interpolation
BASH Variables Part 1: Basic Interpolation
 
Effective Benchmarks
Effective BenchmarksEffective Benchmarks
Effective Benchmarks
 
Metadata-driven Testing
Metadata-driven TestingMetadata-driven Testing
Metadata-driven Testing
 
The W-curve and its application.
The W-curve and its application.The W-curve and its application.
The W-curve and its application.
 
Keeping objects healthy with Object::Exercise.
Keeping objects healthy with Object::Exercise.Keeping objects healthy with Object::Exercise.
Keeping objects healthy with Object::Exercise.
 
Perl6 Regexen: Reduce the line noise in your code.
Perl6 Regexen: Reduce the line noise in your code.Perl6 Regexen: Reduce the line noise in your code.
Perl6 Regexen: Reduce the line noise in your code.
 
Smoking docker
Smoking dockerSmoking docker
Smoking docker
 
Getting Testy With Perl6
Getting Testy With Perl6Getting Testy With Perl6
Getting Testy With Perl6
 
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
Neatly Hashing a Tree: FP tree-fold in Perl5 & Perl6
 
Neatly folding-a-tree
Neatly folding-a-treeNeatly folding-a-tree
Neatly folding-a-tree
 

Dernier

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Dernier (20)

Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 

Perl5 Memory Manglement