Not that it really matters, but 0001144204-09-017358 is not a number but a string.
CountZero A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James My blog: Imperial Deltronics
| [reply] [d/l] |
| [reply] |
Thanks guys, here's the revised statement, along with the result:
if($line=~m/^\s*ACCESSION\s*NUMBER:\s*/m){$access_num=$1; $access_num =~ tr/-//d;}
Result is the error message stating "Use of uninitialized value ...."
??
Thanks!!!
| [reply] |
You forgot to add your capture group of (\d*). However, that won't really help, as that won't capture your - (dashes), or any numbers after it.
Why don't you show us a few lines of example data you're trying to match?
Also, Use of uninitialized... is not an error, it's a warning. It's most likely saying that $1 is uninitialized (because you didn't capture anything).
| [reply] [d/l] [select] |
You are getting an uninitialized error because you are trying to change the content of $access_num, to which you've assigned $1, but there were no parentheses in your first regular expression. Maybe you mean something like:
if ($line =~ s/^\s*ACCESSION\s*NUMBER:\s*/) {
$line =~ tr/-//;
}
or possibly
if ($line =~ s/^\s*ACCESSION\s*NUMBER:\s*([-\d]+)$/m) {
$access_num = $1;
$access_num =~ tr/-//;
}
#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.
| [reply] [d/l] [select] |
| [reply] |
If you get the strings like you say are there, then you can use them as numbers. In Perl, you don't have to call a function to convert a string to a number, if that string is a number, you can just use it like one. Here I just added 10 to the "string" to show that feature. Of course once "$string" is a "number", leading zero'es are suppressed unless you use some kind of printf statement to add them back into the printout. A common idiom to suppress leading zeroes is $number_string+=0;
#!usr/bin/perl
use warnings;
use strict;
my @input = qw /0001144204-09-017358
0001144204-10-065610
0001042167-15-000175
0000053669-16-000051 /;
foreach my $string (@input)
{
$string =~ tr/-//d;
print "string = $string\n";
print "string +10 as number: ", $string + 10,"\n";
}
__END__
prints:
string = 000114420409017358
string +10 as number: 114420409017368
string = 000114420410065610
string +10 as number: 114420410065620
string = 000104216715000175
string +10 as number: 104216715000185
string = 000005366916000051
string +10 as number: 5366916000061
Update: I ran this on Win XP, 32 bit.
normally, 2,147,483,647 would be max int, but Perl 5.22 was able to get 104,216,715,000,185 from the addition. | [reply] [d/l] |
Those are the strings you are transforming, but it looks like you are struggling on extracting the your lines. What do your literal lines look like?
#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.
| [reply] |