Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery

Seekers of Perl Wisdom

( #479=superdoc: print w/replies, xml ) Need Help??

If you have a question on how to do something in Perl, or you need a Perl solution to an actual real-life problem, or you're unsure why something you've tried just isn't working... then this section is the place to ask. Post a new question!

However, you might consider asking in the chatterbox first (if you're a registered user). The response time tends to be quicker, and if it turns out that the problem/solutions are too much for the cb to handle, the kind monks will be sure to direct you here.

User Questions
Increase speed of nested loop Win32 Excel Manipulation
2 direct replies — Read more / Contribute
by Sasuke300
on Feb 16, 2019 at 12:55

    Hey guys I have a problem with the speed of one part of my perl script. My script deals with a manipulation of a excel file. The part where the speed is very low is a nested loop and I have no idea how to avoid that. I can show you the part:

    use strict; use warnings; use Win32::OLE; use Win32::OLE qw(in with); use Win32::OLE::Const "Microsoft Excel" for ($begincol;$begincol<$totcol;$begincol++) { for ($beginrow;$beginrow<$maxrows;$beginrow++) { my $cap = $Sheet2->Cells($beginrow,5)->{'Text'}; my $app = $sheet2->Cells(3,$begincol)->{'Text'}; my $yes = "yes"; if (index($app, $cap) != -1) { $Sheet->Cells($beginrow,$begincol)->{Value} = $asis; } } $beginrow = 7; }
New to perl - Check authenticity of cpan mods installed/used
3 direct replies — Read more / Contribute
by gradius85
on Feb 16, 2019 at 11:00

    Hi everyone,

    I am very new to perl and programming in general. I have started in a position that has me working with legacy Perl code, which has a number of modules from ‘cpan’. Due to this opportunity I am excited to learn Perl since I have read great things about it.

    So far the syntax has been pretty easy for me to understand, and honestly grasping it a little faster then I did Python (all those silly name.item.something

    Anyway my main question.

    I have never used cpan, but I have been watching some youtube videos. However, how do I check or validate the authenticity of the libraries/modules (not sure what is the true name) installed from cpan?

    I am worried, because another team in the company uses JavaScript, and I heard (not sure how true) that they used a library from GitHub that was compromised and had some bitCoin mining software compiled into the library.

    I do not have a college degree, and self-taught myself Python the basics (if you could call that), so I am not allowed to work on that team that uses JavaScript or other programming languages, and I volunteered to work on the legacy perl code items, with the hope of getting good to get experience and exposure to different programming styles and methods.


    Looks like some of the code used object oriented style of code, from what I researched.

    Can anyone offer a good book that discussed OOP styles? Does not have to be perl related, I do not get the concept of OOP and I am struggling with it.

    Thank you so much

Result of failed regexp match not pushed onto array
2 direct replies — Read more / Contribute
by zork42
on Feb 16, 2019 at 07:02

    I'm completely mystified by this.

    In the 3 example code blocks below I'm pushing the same things onto an array.

    When I push the result of a failed match, nothing is pushed onto the array (unless I first save the result in a variable).

    Why is this?!


    use strict; use warnings; my @foo; push @foo, 1; print scalar @foo, "\n"; # output +: 1 push @foo, 'abc' =~ /abc/; print scalar @foo, "\n"; # output +: 2 push @foo, 'abc' =~ /abcd/; print scalar @foo, "\n"; # output +: 2 - nothing added to @foo?! push @foo, ''; print scalar @foo, "\n"; # output +: 3 push @foo, 0; print scalar @foo, "\n"; # output +: 4 push @foo, undef; print scalar @foo, "\n"; # output +: 5 @foo = (); print "\n"; push @foo, (1); print scalar @foo, "\n"; # output +: 1 push @foo, ('abc' =~ /abc/); print scalar @foo, "\n"; # output +: 2 push @foo, ('abc' =~ /abcd/); print scalar @foo, "\n"; # output +: 2 - nothing added to @foo?! push @foo, (''); print scalar @foo, "\n"; # output +: 3 push @foo, (0); print scalar @foo, "\n"; # output +: 4 push @foo, (undef); print scalar @foo, "\n"; # output +: 5 @foo = (); my $bar; print "\n"; $bar = 1; push @foo, $bar; print scalar @foo, "\n"; + # output: 1 $bar = 'abc' =~ /abc/; push @foo, $bar; print scalar @foo, "\n"; + # output: 2 $bar = 'abc' =~ /abcd/; push @foo, $bar; print scalar @foo, "\n"; + # output: 3 - this time its been added to @foo $bar = ''; push @foo, $bar; print scalar @foo, "\n"; + # output: 4 $bar = 0; push @foo, $bar; print scalar @foo, "\n"; + # output: 5 $bar = undef; push @foo, $bar; print scalar @foo, "\n"; + # output: 6
Perl to C problem
2 direct replies — Read more / Contribute
by lbrandewie
on Feb 16, 2019 at 00:49

    Hey folks,

    I'm having a problem. I'm porting some perl to C to speed it up, and I can't get the two languages to agree on what's going on. I'm using ActiveState's perl 5.24.1 for Windows. Consider the following code:

    $test = "\n\n\n\n\n";
    for ($x = 0; $x < length($test); $x++) {
        print ord(substr($test, $x, 1));

    The code prints a string of 10s, indicating that the 13/10 combination in Windows has been translated to a bare 10. I can understand that, for compatibility reasons. But it seems to mean there is no way in Windows of telling a 13/10 combo from a bare 10. This makes a difference in my code, in that I can't get C and perl to hash the same string the same way. Am I missing something? Is there no way at all to tell a 13/10 from a 10 in Windows perl?

    I believe the upshot of this, where my code is concerned, is that perl is doing it "wrong" compared to C and I'll never get the two to agree. I hope I'm wrong about that. I note with interest and mild annoyance that strlen("\n") == 1 even in C for windows. But C allows me to get at the underlying character buffer and perl does not.



Function::Parameters, Types::Standard, and Perl::Critic
2 direct replies — Read more / Contribute
by choroba
on Feb 15, 2019 at 18:36
    After switching to Function::Parameters, I noticed Perl::Critic no longer worked. For example, for the old fashioned
    sub foo { $_[0] + 1 }
    perlcritic -1 outputs
    Always unpack @_ first at line 22, column 1. See page 178 of PBP. (S +everity: 4) Subroutine "foo" does not end with "return" at line 22, column 1. See + page 197 of PBP. (Severity: 4)

    but for the equivalent

    use Function::Parameters; fun foo ($x) { $x + 1 }
    it doesn't say anything.

    I've found a partial workaround: running perlcritic on the output of B::Deparse instead of the source itself. It reports lots of sins committed by Function::Parameters themselves (e.g. Magic variable "$^H" should be assigned as "local" at line 14, column 44. See pages 81,82 of PBP.) but seems to work.

    Unfortunately, it gets more complex when Types::Standard are added to the mix.

    use Function::Parameters; use Types::Standard qw( Num ); fun foo (Num $x) { $x + 1 }
    The code doesn't look much more complicated, but running perl -MO=Deparse on it just hangs. Output of strace ends with endlessly repeating lines:
    mmap(NULL, 192512, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1 +, 0) = 0x7fe772fdf000 mremap(0x7fe771772000, 532480, 536576, MREMAP_MAYMOVE) = 0x7fe77177200 +0 brk(0x49ac000) = 0x49ac000 brk(0x49cd000) = 0x49cd000 mremap(0x7fe771772000, 536576, 540672, MREMAP_MAYMOVE) = 0x7fe77177200 +0 brk(0x49ee000) = 0x49ee000 brk(0x49ed000) = 0x49ed000 brk(0x4a0e000) = 0x4a0e000 brk(0x4a2f000) = 0x4a2f000 mremap(0x7fe771772000, 540672, 544768, MREMAP_MAYMOVE) = 0x7fe77177200 +0 ...
    The perl process seems to grow in memory very slowly at the same time.

    Has anyone succeeded in linting a code that uses the above mentioned modules? Tips, tricks, suggestions welcome.

    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
Parsing JSON out of an incremental stream
2 direct replies — Read more / Contribute
by Sec
on Feb 15, 2019 at 11:40

    Hi. I'm looking for a simple way to parse JSON objects out of a stream.

    I am calling an HTTP service that returns a stream of json objects over time.

    To read it, i registered a simple callback handler in LWP::UserAgent

    $ua->add_handler( response_data => sub { my($response, $ua, $h, $data) = @_; return "true" if $data =~ /^\s*$/; print "Callback triggered\n"; print "data: .${data}.\n"; my $result = eval { $json->decode( $data ) }; if ($@){ print "error: $@\n"; return "true"; }; print Dumper $result; return "true"; } );

    As expected, i sometimes get partial json objects in $data.

    My first idea would be to so something like m/{.*?}/ against $data. Or rather some more elaborate version that deals with balanced parens and quoted strings.

    My question is, is there an easier / simpler / more straightforward way to deal with something like this that I am missing?

    -- Sec
    EDIT: to clarify a bit.

    The problem is that in the callback $data may just be

    { "foo": "bar" } { "foo" : "q
    which means I have to grab one object, handle it, keep the rest and wait for more data.

    I know how to write code for that "the long way". I was asking if there is something clever or an existing module that can help with this.

Print out hash
2 direct replies — Read more / Contribute
by catfish1116
on Feb 15, 2019 at 11:07

    I am trying to create a hash and then print it out. When executing program, I am getting $key & $value need explicit package. O wise monks, please show me the error of my ways :)

    #! /usr/bin/perl use v5.12; use warnings; ## 2/15/19 my @people = qw{ fred barney fred wlima dino barney fred pebbles +}; my %count; # new empty hash $count{$_}++ foreach @people; while ( ($key, $value) = each %count) { print "$key => $value\n"; } ~

    TIA the catfish

can has ELI5 namespace::autoclean pls?
2 direct replies — Read more / Contribute
by Ea
on Feb 15, 2019 at 09:58
    Friday afternoon question: what's the real purpose of namespace::autoclean in your OO code?

    I've seen it in classes written with Moose, but the description Keep imports out of your namespace doesn't really speak to me about the advantage of using it. Where am I going to get bitten if I don't use it. Just a simple answer will do.



    Sometimes I can think of 6 impossible LDAP attributes before breakfast.

    Mojoconf was great!

hash of hash
3 direct replies — Read more / Contribute
by Tigor
on Feb 15, 2019 at 07:32

    i have been working on this example but not able to achieve it.please someone help me out.Below is my requirement

    i have text file name SalesofCars.txt which contains below data

    Car_Name In2017 In2018 In2019 Hyundai 45 40 48 Volvo 23 29 31

    the desired output should be as below

    output: {'Hyundai' => {'In2017' => 20, 'In2018' => 30, 'In2019' => 50}}
plugin 'mysql_old_password' cannot be loaded
1 direct reply — Read more / Contribute
by frazap
on Feb 15, 2019 at 02:57

    I setup a new perl (strawberry portable) and I'm stuck with a failing connection to mysql server. That connection was working (and is still working) without problem on my old perl setup. I have no admin rights on the mysql server, I didn't create the users and password myself.

    I have tried to move DBIx::Class in perl/site/lib and DBI in perl/vendor/lib from the old to the new install, but that does not change the problem.

    The error is
    DBI Connection failed: DBI connect('host= ... ;database= ... ;','user_ +name',...) failed: Authentication plugin 'mysql_old_password' cannot +be loaded: The specified module could not be found. at c:/spp/perl/vendor/lib/DBIx/Class/Storage/ line 1517. at c:/ +spp/perl/vendor/lib/DBIx/Class/ line 1118. DBIx::Class::Schema::throw_exception(Dbc::Schema=HASH(0x5aa0c2 +4), "DBI Connection failed: DBI connect(';datab".. +.) called at c:/spp/perl/vendor/lib/DBIx/Class/ line 113 DBIx::Class::Storage::throw_exception(DBIx::Class::Storage::DB +I=HASH(0x5aa516c), "DBI Connection failed: DBI connect('host=mysql.un;datab"...) called at c:/spp/perl/vendor/lib/DBIx/Class/Storage +/ line 1558 DBIx::Class::Storage::DBI::catch {...} ("DBI connect('host=mys;database=dokpe_i02;','dokpe_"...) called at c:/spp/perl/v +endor/lib/Try/ line 123

    Thanks for any help


Add your question
Your question:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":

  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?

    What's my password?
    Create A New User
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others musing on the Monastery: (3)
    As of 2019-02-17 01:23 GMT
    Find Nodes?
      Voting Booth?
      I use postfix dereferencing ...

      Results (95 votes). Check out past polls.