#!/usr/bin/perl
use strict;
use warnings;
while (<DATA>)
{
my $first = substr $_, 37, 20;
my $second = substr $_, 67, 3;
print STDOUT "FIRST: $first\nSECOND: $second\n\n";
}
__DATA__
j1000010017 6790194100109201301092013THIS TO BE PRINTED M PW09-3PY248
+005BIK00
| [reply] [Watch: Dir/Any] [d/l] |
Thanks, this worked perfectly.
| [reply] [Watch: Dir/Any] |
substr shows various uses of substr. Which parts did you find problematic? Which parts have you applied to your problem, and what were the results?
| [reply] [Watch: Dir/Any] [d/l] |
Well, I did try:
print{ substr(( my $lines, $schemePOS, 20) and ( my $lines, $abiPOS, 3)); }
But I got the following:
Global symbol "$lines" requires explicit package name at ./efhv2.pl li
+ne 27.
Global symbol "$lines" requires explicit package name at ./efhv2.pl li
+ne 27.
Not enough arguments for substr at ./efhv2.pl line 27, near "))"
I'm not even sure if you can do that with the substr method.
But as I say I'm not sure of the syntax for it. | [reply] [Watch: Dir/Any] [d/l] [select] |
A couple issues here.
my is used to declare a lexical variable. In general, my $lines should appear once in your code, when you first use it. If you are going through a file, it might look like:
while (my $lines = <$fh>) {...
The text you have written declares two new, undefined variables named $lines.
and is a logical operator. The code you wrote takes two lists (( my $lines, $schemePOS, 20) and ( my $lines, $abiPOS, 3)) and tests if they are both logically true. Since the lists are both longer than 0 elements, and returns a true value, and this true value is then fed into substr, which expects at least two arguments, thus the returned error.
Lastly, print takes a list (parentheses), not a block (curly brackets) as an argument. Either print $arg1, $arg2, ...
or, if you want to have a clear delimiter,
print($arg1, $arg2, ...)
The code you meant to write would probably look like:
print substr($lines, $schemePOS, 20), substr($lines, $abiPOS, 3);
I have fed print a list of two values, which are the return values of the substrs. There are a number of ways to do this, but they'd all fit this general pattern.
Given your apparent familiarity with the language, I'd suggest going through some introductory learning materials. http://learn.perl.org has a number of resources available, including free access to Beginning Perl.
#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.
| [reply] [Watch: Dir/Any] [d/l] [select] |
| [reply] [Watch: Dir/Any] [d/l] |
Please show a short, self-contained program that exhibits the problem.
Your code is almost valid Perl, but it is highly nonsensical. Maybe you can explain in English what the characters you wrote are supposed to mean.
I don't know how to advise you further, other than to learn Perl from a tutorial. You cannot take English sentences and hope that Perl will interpret them as you intend.
| [reply] [Watch: Dir/Any] |
... substr ... not sure of the syntax ...
In addition to the on-line Perl documentation for substr linked by Corion, there's also
perldoc -f substr
from your friendly local command line. See perldoc (or
perldoc perldoc
from the command line).
| [reply] [Watch: Dir/Any] [d/l] [select] |
Perhaps you meant to code you solution like this:
#!/usr/bin/perl
use 5.016;
use warnings;
# 1055294
my $line = ' j1000010017 6790194100109201301092013THIS TO BE PRINTED
+M PW09-3PY248005BIK00 ';
say substr( $line, 38, 20);
say substr( $line, 68, 3);
=head EXECUTION
C:\>D:\_wo\1055294.pl
THIS TO BE PRINTED
248
=cut
Explanation: perldoc -f substr.
Because you didn't RTFM, you owe apologies to all those electrons which were inconvenienced by the creation of this post.
| [reply] [Watch: Dir/Any] [d/l] [select] |