Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

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
Best way to validate a string as a color?
5 direct replies — Read more / Contribute
by pra
on Oct 17, 2017 at 11:37

    What is the best way to find out if a given string is a valid color? I am writing a Perl/TK program that will read in a file which contains color names. Users might not be aware of which names are allowed, or could mis-type something.

    It seems to me that I could compare with names from the list which on my Linux machine is in /usr/share/X11/rgb.txt (and add a check for colors of the form #rrggbb, no reason to exclude those). Can I expect that list to be standard on all systems (Linux, Windows, Macs)? Even if it is standard, is that the best way to do it?

    Certainly, if I use an incorrect color name, I get an error message. Could I make use of the verification system being used there, and if so, how?

Issues Fetching URL with a variable token
4 direct replies — Read more / Contribute
by Petroza
on Oct 17, 2017 at 11:34
    Hey there, I'm trying out a script in perl language using Selenium Chrome Driver as engine. It's a fairly simple code but I got to a part that kept blocking my process for 2-3 days now and I can't seem to get around it. The script consists into logging into an online game account and opening the main page (it's pretty simple as I said, after all it's just exercises for me before I get the hand of it).
    use feature ':5.10'; use strict; use warnings; use Selenium::Chrome; use Selenium::Remote::WebElement; my $driver = Selenium::Chrome->new; my $a = 'email'; #write email here my $b = 'password'; #write password here my $login_url = "link/login/"; #link to the website (link is a substi +tute to the actual URL which was considered spam so i just wrote "lin +k") $driver->get( $login_url ); #navigate to the website my $name = $driver->find_element("//input[@name='mailAddress']"); $name->send_keys( $a ); #find and input mail address my $password = $driver->find_element("//input[@name='password']"); $password->send_keys( $b ); #find and input password my $Login_button = $driver->find_element("//input[@value='Login']"); $Login_button->click(); #find and click login button

    So far the code is perfect. Now, after reaching this part the struggles started. After logging in an image appears with a ''My Page'' button. This button leads to the my page menu (duh) where I want my script to end at. The source code for the button is below:

    <a id="enterBtn" class="push-motion0 js-onceLink" href="link/mypage?t=1pSX7e.3KXy.asX.2k42h.1klg0.280f08.H" style="user-select: none; touch-action: pan-y; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></a>

    I've tried several things to get past this but I just can't get to navigate to My page and/or ''click'' the button. The thing is the http URL has a base part


    and a token part


    The token part changes EVERY time you reopen the page so I CANNOT (or I don't know how to) assign the url to a variable like I did above since it gives me an error upon entering the expired link.

    Instead I tried to SEARCH for elements containing the partial link text:

    my $my_page = $driver->find_element("//a[@href='link/mypage?t=]"); my $href = $my_page->get_attribute("href"); $driver->get($href); <>;

    Also tried 'click' instead of 'get' with same result.

    The script stops at the current page without navigating to "My page" menu. The error bellow appears in the .bat that I use to execute the command.

    "Use of uninitialized value in substitution iterator at C:/Perl64/site/lib/Selenium/Remote/ line 437."

    I just can't seem to get past this element and finally open "my page" menu. It has something to do with XPath but I think I'm missing something (simple yet essential).

Puzzle Regex: Letter Frequency Arithmetic Sequence
2 direct replies — Read more / Contribute
by QM
on Oct 17, 2017 at 11:03
    I ran across a blog post about an interesting word characteristic, and wondered if a regex can be written to match this (e.g., with the plan to search a dictionary file). I suspect the answer is no, without invoking the magic "code in a regex".

    Unfortunately, I don't have time now to try my hand at it, but I thought I'd post it here for everyone to have a go.

    Quantum Mechanics: The dreams stuff is made of

copying file from one server to other
3 direct replies — Read more / Contribute
by vickey110
on Oct 17, 2017 at 03:21

    I have a directory named systems which contains two more directories system1 and system2 and each of these directory contains bunch of files. Out of those I need to export only .csv files to my local machine as I am working on Unix in Putty. Using the scp command as

     scp /user/vickey/systems/system1/file1.csv vickeys@localhost:C:/

    but copying each file one by one is taking too long. Could anyone suggest how I can do the same using a Perl script without editing the file name each time.

How to use this subroutine
4 direct replies — Read more / Contribute
by bisimen
on Oct 16, 2017 at 10:35

    I can't figure out how to apply this subroutine (pretty_print) to my data:

    #!/usr/bin/perl use warnings; #use strict; ($sfile_1, $sfile_2) = @ARGV; ($id1, $seq1) = read_fasta($sfile_1); ($id2, $seq2) = read_fasta($sfile_2); pretty_print(\$id1, \$seq1); pretty_print(\$id2, \$seq2); sub read_fasta { ## reads a single sequence from a fasta file my $seqFile = shift @_; my $seq = ""; my $id = ""; open(my $in, "<", $seqFile) or die "unable to open $seqFile $!\n"; while(<$in>){ chomp; if($_ =~ /^>(\S+)/ ){ last if(length($id)); $id = $1; next; } if(length($id)){ $seq .= $_; } } return ($id, $seq); } sub pretty_print { my($seq, $colno) = shift @_; # We want to start from 0, and increment the starting position. # for this we use a classical loop. for (my $b=0; $b < length($seq); $b += $colno){ print( substr($seq, $b, $colno), "\n"); } } exit;

    The two data files if needed: and

"no warnings 'uninitialized'" failing
5 direct replies — Read more / Contribute
by jest
on Oct 16, 2017 at 10:05

    An older part of our codebase has a function for converting a data structure to XML, using XML::Simple (for some legacy reason), and saving it to a directory.

    At some point, we upgraded XML::Simple to 2.24, and it started throwing "Use of uninitialized value" errors. Whatever caused this was irrelevant to our purposes, so I put this in a block with "no warnings 'uninitialized';", and all was good.

    For no reason that I can tell--I didn't upgrade any package, or my Perl version (5.16.3 for this)--our test suite is now throwing the error again, though the "no warnings" is right there:

    use XML::Simple; my $xml; { # Suppress warnings from XML::Simple 2.24 no warnings 'uninitialized'; my $xmlout = XMLout($data, NoAttr => 1, RootName => undef, Suppres +sEmpty => 0); $xml = '<xml version="1.0" encoding="UTF-8">' . "\n$xmlout</xml>"; }
    Result from test suite:
    Use of uninitialized value at /[path/to]/ line 205. Use of uninitialized value at /[path/to]/ line 205. Use of uninitialized value at /[path/to]/ line 205. [...]
    Where line 205 is the "my $xmlout..." from above.

    Can someone explain why I am getting a warning that I explicitly shut off on the immediately preceding line? And how I stop this? The tests pass, but it's distracting as hell to get 50 lines of this error every time we run it.

XML::Smart - undesired decoding of special XML characters
3 direct replies — Read more / Contribute
by NeedForPerl
on Oct 16, 2017 at 04:34

    Hi, Monks I'm using XML::Smart and running into some problems if there a special characters in the XML document:

    If i create an XML::Smart object that encapsulates an XML document which contains special characters like "" or "" the function data() uses Base64 encoding but i don't want that. So i decided to use the function with the argument "decode => 1".

    After that change everthing works fine unless there are special XML characters like "<", ">" or "&" inside an XML element . I guess that the call of data(decode => 1) results in encoding "&amp;" to "&" for instance. Is it possible to avoid that behaviour?

    I used the function set_binary('FALSE') but somehow it didn't work:

    my $log = `svn log http://... --xml --revision 123`; my $test = XML::Smart->new($log); $test->{log}->{logentry}[0]->{msg}->set_binary('FALSE'); print $test->data();

    I'm using version 1.78 of the module.

    I have tried to contact the author via mail using the e-mail address which can be found on the FAQ of XML::Smart. The E-Mail address doesn't exist anymore.

    Many thanks in advance.

Invalid Reference Use - warning Noob
3 direct replies — Read more / Contribute
by jorba
on Oct 15, 2017 at 15:10
    I am trying to construct a moose class that represents a single record retrieved from the db. I'm getting a problem which I'm pretty sure is from the attempt to assign values to a hash "property" of the class. But I could be wrong ;o)

    package AXRecord; # Our libraries use lib 'C:\Users\Jay\Desktop\SBS DEV\CODE\perl\Utilities'; use AXControl; use AXSQL; use Moose; use DBI; # Attributes has 'Name' => (is => 'rw', isa => 'Str', required => 1); has 'Fields' => (is => 'ro', isa => 'Hash'); has 'FieldCount' => (is => 'ro', isa => 'Num'); has 'Changed' => (is=>'rw', isa => 'Boolean'); has 'Where' => (is => 'rw', isa => 'Str'); has 'ControlObject' => (is => 'rw', isa => 'Object', required => 1); has 'Keys' => (is => 'rw', isa=>'Array'); # Contains a single record sub BUILD # Constructor { my $self; $self = shift; if (defined $self->Where) { $self->Select(); } } # Insert the record sub Insert { } #Delete using the keys in the record sub Delete { } #Update using the keys and values in the record sub Update { } #Save the record sub Save { } sub Select { my ($SQLStr, $Cnt, $sql, @Values, $self, $Col, @Flds, $i); $self = shift; $SQLStr = "SELECT * FROM " . $self->Name . ' ' . $self->Where; $sql = AXSQL->new(ControlObject => $self->ControlObject, SQLString + => $SQLStr); #construct a hash using the metadata and the data from the actual +table $self->Fields = {}; @Values = $sql->Fetch(); #Get field Names $sql = AXSQL->new(ControlObject => $self->ControlObject, SQLString + => "show fields from '" . $self->Name . "'"); @Flds = $sql->fetch(); # Construct the hash for ($i..$#Flds) { $self->Fields{$Flds[$i]} = $Values[$i]; } $self->Keys = (); $sql = AXSQL->new(ControlObject => $self->ControlObject, SQLString + => "SELECT column_name FROM information_schema.`key_column_usage` WH +ERE table_name = '" . $self->name . "' order by ordinal_position"); while (($Col) = $sql.fetch()) { push $self->Keys, $Col; } $Cnt = $self->Fields; $self->FieldCount = $Cnt; $self->Changed = -1; }

    The error messages I am getting all seem to be caused by what I'm doing wrong in this statement

    $self->Fields{$Flds[$i]} = $Values[$i];

    All of the declaration errors are about variables that work fine before that line. The hash Fields is a property of the class and I'm trying to populate it with fieldname/value pairs Here are the error messages (moose warnings excluded)

    C:\Users\Jay\Desktop\SBS DEV\CODE\perl\Utilities>perl -w push on reference is experimental at line 83. syntax error at line 76, near "->Fields{" Global symbol "$self" requires explicit package name (did you forget t +o declare "my $self"?) at line 79. Global symbol "$sql" requires explicit package name (did you forget to + declare " my $sql"?) at line 80. Global symbol "$self" requires explicit package name (did you forget t +o declare "my $self"?) at line 80. Global symbol "$self" requires explicit package name (did you forget t +o declare "my $self"?) at line 80. Global symbol "$Col" requires explicit package name (did you forget to + declare " my $Col"?) at line 81. Global symbol "$sql" requires explicit package name (did you forget to + declare " my $sql"?) at line 81. Global symbol "$self" requires explicit package name (did you forget t +o declare "my $self"?) at line 83. Global symbol "$Col" requires explicit package name (did you forget to + declare " my $Col"?) at line 83. Global symbol "$Cnt" requires explicit package name (did you forget to + declare " my $Cnt"?) at line 86. Global symbol "$self" requires explicit package name (did you forget t +o declare "my $self"?) at line 86. Global symbol "$self" requires explicit package name (did you forget t +o declare "my $self"?) at line 87. Global symbol "$Cnt" requires explicit package name (did you forget to + declare " my $Cnt"?) at line 87. Global symbol "$self" requires explicit package name (did you forget t +o declare "my $self"?) at line 88. syntax error at line 90, near "}" has too many errors. C:\Users\Jay\Desktop\SBS DEV\CODE\perl\Utilities>
Adding values in a variable
3 direct replies — Read more / Contribute
by bisimen
on Oct 15, 2017 at 14:23
    Hi, Monks. I'm very new to Perl and programing. But I'm stuck right now. First, the code:
    #!/usr/bin/perl use warnings; no warnings 'uninitialized'; #Calculating Protein Mass ($input) = $ARGV[0]; open ($in, "<", $input) || die "Can't open \"$input\".\nError = $!.\n" +; $protein = <$in>; my(%mass_values) = ( 'A' => 71.03711, 'C' => 103.00919, 'D' => 115.02694, 'E' => 129.04259, 'F' => 147.06841, 'G' => 57.02146, 'H' => 137.05891, 'I' => 113.08406, 'K' => 128.09496, 'L' => 113.08406, 'M' => 131.04049, 'N' => 114.04293, 'P' => 97.05276, 'Q' => 128.05858, 'R' => 156.10111, 'S' => 87.03203, 'T' => 101.04768, 'V' => 99.06841, 'W' => 186.07931, 'Y' => 163.06333, ); my $mass = ""; for(my $i=0;$i<length($protein);$i+=1) { $codon = substr($protein,$i,1); $mass .= "$mass_values{$codon}\n"; } print $mass; ($result) = $ARGV[1]; open ($out, ">", $result) || die "Can't write to \"$result\".\nError = + $!.\n"; print $out "$mass"; close "$out"; exit;

    This program is for this problem:

    In order to run it, you need a protein string file, but you need to be registered to get one from rosalind, but here is the data string I'm using:

    Now, this program I've written is just a modification of some codes I found here and there (And I kinda understand how it works). There is probably better ways of doing it, so just say if you see a quicker and easier solution!

    Anyway, I'm stuck at the part were I have to sum up all the numbers. Right now, if I run it, I will just get a long list of numbers like this:










    But I've no idea how to sum it all up. I've tried to make it into an array, but then I get errors saying "this is not a number", because I think perl thinks all of the different numbers is one element, and not 1000 different elements...

    Anyway, I did complete the problem by "writing"(stole and modified) a separate program to sums it all up:

    #!/usr/bin/perl use strict; use warnings; # given a file with a number on each row, print the sum of the numbers my $sum = 0; my $filename = "result.txt"; open(my $fh, "<", $filename) or die "Could not open '$filename'\n"; while (my $line = <$fh>) { $sum += $line; } print "The total value is $sum\n";

    (I did try to put the above code into the first program, so that the program writes to the results file, then opens the results file, and then does the addition. But for some reason, I get the wrong answer doing it this way, like it skips adding some numbers for some reason...

    But I feel that this is something that can be done easily with just one perl program. But it was just my way of bodging it.

    Anyway, hope someone can correct me and explain my mistakes!

comparing ranges of numbers between 2 files
2 direct replies — Read more / Contribute
by Anonymous Monk
on Oct 15, 2017 at 06:31
    Hello everyone!
    I have 2 text files with some number ranges, e.g.:
    in one file and 100000391-100000947 in the other.
    My goal is to take each line from each file and see if it is somehow "contained" in the other. As you can see from the example, the range 100000391-100000947 is within the range 100000313-100001222.
    Can you provide me with some help as to how I can deal with such a problem?
    Is there some module or something?
    Thank you very much for your time!

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 all is quiet...

    How do I use this? | Other CB clients
    Other Users?
    Others contemplating the Monastery: (4)
    As of 2017-10-18 00:32 GMT
    Find Nodes?
      Voting Booth?
      My fridge is mostly full of:

      Results (239 votes). Check out past polls.