Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: Find element in array

by tobyink (Canon)
on Feb 16, 2020 at 12:46 UTC ( [id://11113022]=note: print w/replies, xml ) Need Help??


in reply to Find element in array

Instead of matching valid sequences, match invalid characters. Then use $-[0] to find the position of that match. (The @- array is documented in the "perlvar" manual page.)

use strict; use warnings; while (my $sequence = <DATA>) { chomp $sequence; if ($sequence =~ /[^ATCG]/){ warn "Sequence '$sequence' has invalid character after " . $-[ +0]; } else { print "Valid sequence: '$sequence'\n"; } } __DATA__ TAAGAACAATAAGAACAA TAAGAACAATAAUAACAA TAAGAACAATAAGAACAA

You don't need to split the sequence up into individual characters and process each one separately. That's slow.

Replies are listed 'Best First'.
Re^2: Find element in array
by LanX (Saint) on Feb 16, 2020 at 13:29 UTC
    Addendum: $. aka $INPUT_LINE_NUMBER will also give the current line number when reading from a file handle.

    Update

    use strict; use warnings; while (my $sequence = <DATA>) { chomp $sequence; if ($sequence =~ /[^ATCG]/){ warn "Sequence '$sequence' in line $. has invalid character af +ter " . $-[0]; } else { print "Valid sequence: '$sequence'\n"; } } __DATA__ TAAGAACAATAAGAACAA TAAGAACAATAAUAACAA TAAGAACAATAAGAACAA

    Sequence 'TAAGAACAATAAUAACAA' in line 2 has invalid character after 12 at parse_dna.pl line 7, <DATA> line 2.
    

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

      Take a look at that warning message:

      Sequence 'TAAGAACAATAAUAACAA' in line 2 has invalid character after 12 + at parse_dna.pl line 7, <DATA> line 2. ^^^^^^ + ^^^^^^

      The warn function already includes $. in its output, unless your message ends in "\n".

        > The warn function already includes $.

        I've been aware of this, but how can we know if the OP will use warn for logging or doesn't prefer to push the line-numbers in an array?

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery

      I still can't get this to work. I am obviously missing something. So what I want to do is: Use an input DNA sequence and put in array. For each element in array check if the element is a nucleotide. If not a nucleotide print "not a valid character at position xx". In the end, print out the number of characters that were valid and the number of characters that were not valid, calculate the percentage of non-valid characters. Does this make sense? Thanks
        > I still can't get this to work. I am obviously missing something. So what I want to do is: Use an input DNA sequence and put in array. For each element in array check if the element is a nucleotide. If not a nucleotide print "not a valid character at position xx".

        you got everything for this, does it work?

        > In the end, print out the number of characters that were valid and the number of characters that were not valid, calculate the percentage of non-valid characters.

        That's a new question, you should learn step by step.

        > Does this make sense?

        Well people answered two very different questions in this thread. You could do better.

        Please post your code so far, and try to be clearer what you want.

        Most of us here are reluctant to write speculative code if the questions are fuzzy and leave room to various interpretations.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery

Re^2: Find element in array
by Sofie (Acolyte) on Feb 16, 2020 at 13:22 UTC
    Thanks for your quick reply. I still don't get it to work, sorry I am really a beginner at this. The ultimate goal is to print out all the positions in the original array @DNA that has an invalid character. And then to count the number of characters that are invalid. How is the if statement looking or the invalid characters? How can I use the $-[0] to find the position of the invalid characters? Thanks again

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11113022]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (4)
As of 2024-04-20 16:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found