im working a a perl script for a class and i need to call a file and print it out with line numbers.
i need help with this line with what to put in the capitalized words
SYNTAX ($LINEEQUALITY OPERATOR<MY_FILE>){
also should i replace MY_FILE with a different syntax or will that work?
here is my entire script
#!/usr/bin/perl -w
unless (scalar(@ARGV) == 2){
print "error: incorrect number of arguments",
"\n",
"usage: linenum.pl [filename]",
"\n";
exit 1;
}
# Open function used with filehandle and input file.
open(MY_FILE, "$ARGV[1]") or die
"error: argument must be a file\n",
"usage: linenum.pl [filename]\n$!\n";
# Check if file is a directory
if (-d "$ARGV[1]"){
print "error: argument must be a file",
"\n",
"usage: linenum.pl [filename]\n";
exit 1;
}
$COUNTER=1; # Used for printing line numbers
# Loop and write lines from file
SYNTAX ($LINEEQUALITY OPERATOR<MY_FILE>){
# Adds leading zeros for numbers 1 digit long
if ($COUNTER<10){
print "000";
}
# Adds leading zeros for numbers 2 digits long
if (($COUNTER>9) && ($COUNTER<100)){
print "00";
}
# Adds leading zeros for numbers 3 digits long
if (($COUNTER>99) && ($COUNTER<1000)){
print "0";
}
# Prints line number and line
print "$COUNTER: $LINE";
$COUNTER+=1;
}
exit 1;
Why so much complication ?
$. gives you the current line number.
printf allows you to format it as you wish.
$
$ cat f0
This is line number 1
This is line number 2
This is line number 3
This is line number 4
This is line number 5
This is line number 6
This is line number 7
This is line number 8
This is line number 9
This is line number 10
$
$ perl -ne 'printf("%04d: %s", $., $_)' f0
0001: This is line number 1
0002: This is line number 2
0003: This is line number 3
0004: This is line number 4
0005: This is line number 5
0006: This is line number 6
0007: This is line number 7
0008: This is line number 8
0009: This is line number 9
0010: This is line number 10
$
ok i got it working this far and error reporting for if its a directory and if theres not enough arguments are working but im still getting an error when it should work such as
./linenum.pl FILENAME
and im getting this error
Name "main::MY_FILE" used only once: possible typo at ./linenum.pl line 34.
Use of uninitialized value in string at ./linenum.pl line 11.
Undefined subroutine &main::Open called at ./linenum.pl line 11.
any advice?
#!/usr/bin/perl -w
unless (scalar(@ARGV) == 1){
print "error: incorrect number of arguments",
"\n",
"usage: linenum.pl [filename]",
"\n";
exit 1;
}
# Open function used with filehandle and input file.
Open(MY_FILE, "$ARGV[0]") or die
"error: argument must be a file\n",
"usage: linenum.pl [filename]\n$!\n";
# Check if file is a directory
if (-d "$ARGV[0]"){
print "error: argument must be a file",
"\n",
"usage: linenum.pl [filename]\n";
exit 1;
}
$COUNTER=1; # Used for printing line numbers
# Loop and write lines from file
while ($LINE=<MY_FILE>){
# Adds leading zeros for numbers 1 digit long
if ($COUNTER<10){
print "000";
}
# Adds leading zeros for numbers 2 digits long
if (($COUNTER>9) && ($COUNTER<100)){
print "00";
}
# Adds leading zeros for numbers 3 digits long
if (($COUNTER>99) && ($COUNTER<1000)){
print "0";
}
# Prints line number and line
print "$COUNTER: $LINE";
$COUNTER+=1;
}
exit 0;
Those are warnings (as opposed to errors), and are shown to you because you set the "-w" switch in the first line.
The first and second one should be pretty obvious. As for the third warning, note that the function is "open" and not "Open" - function names are case-sensitive in Perl, unlike say, Oracle.
About your previous question - no you cannot use the Perl one-liner inside your Perl script. Well, technically you *can*, but that's like wearing a hat on top of a hat - possible, but stupid and clumsy.
Here's one way to do it with Perl -
$
$ cat f0.pl
#!/usr/bin/perl -w
unless ( $#ARGV == 0 ) {
print "error: incorrect number of arguments\nusage: linenum.pl [filename]\n";
exit 1;
}
# Check if file is a directory
if ( -d "$ARGV[0]" ) {
print "error: argument must be a file\nusage: linenum.pl [filename]\n";
exit 2;
}
# Open function used with filehandle and input file.
open (MY_FILE, "$ARGV[0]") or die "Can't open $ARGV[0]: $!";
# Loop and write lines from file
while (<MY_FILE>) {
# Prints line number and line
printf("%04d: %s", $., $_);
}
close (MY_FILE) or die "Can't close $ARGV[0]: $!";
$
$
Test run -
$
$ # no arguments
$ perl f0.pl
error: incorrect number of arguments
usage: linenum.pl [filename]
$ echo $?
1
$
$ # more than one argument
$ perl f0.pl f0 f1 f2
error: incorrect number of arguments
usage: linenum.pl [filename]
$ echo $?
1
$
$ # a directory as an argument
$ perl f0.pl mydir
error: argument must be a file
usage: linenum.pl [filename]
$ echo $?
2
$
$ # an unreadable file as an argument
$ perl f0.pl f1
Can't open f1: Permission denied at f0.pl line 12.
$ echo $?
13
$
$ # successful run
$ perl f0.pl f0
0001: This is line number 1
0002: This is line number 2
0003: This is line number 3
0004: This is line number 4
0005: This is line number 5
0006: This is line number 6
0007: This is line number 7
0008: This is line number 8
0009: This is line number 9
0010: This is line number 10
$
$