#!/usr/local/bin/perl -- -*- C -*- # this is 'read_students.pl' #last_name+first_name+password, where '+' is the delimter $filename = "students_fall_96.dat"; open ( STUD_FILE , $filename) ; $i = 0; while(<STUD_FILE>){ chop;#we are here assuming that there will be a carriage return # at the end of each line, i.e., that we create the file using # an editor. # We may need to change this, since we can use students to # self-register. $single_student[$i] = $_; $p1 = index($single_student[$i],'+'); $last_name[$i] = substr($single_student[$i],0,$p1-1); $p2 = index($single_student[$i],'+',p1+1); $first_name[$i] = substr($single_student[$i],$p1+1,$p2-1); $password[$i] = substr($single_student[$i],$p2+1); print "first_name = ",$first_name[$i]," "; $i = $i + 1; }; close (STUD_FILE);
#!/usr/local/bin/perl -- -*- C -*- # this is 'read_students.pl' #last_name+first_name+password, where '+' is the delimter $filename = "students_fall_96.dat"; open ( STUD_FILE , $filename) ;The line
$i = 0;
$i = 0;
while(<STUD_FILE>){along with the closing `}' will read, one line at a time, the file whose file handle is STUD_FILE.
chop;#we are here assuming that there will be a carriage return # at the end of each line, i.e., that we create the file using # an editor. # We may need to change this, since we can use students to # self-register.chop is another Perl peculiarity, which takes the line which was just read in and removes the last character. Very often (as in our case) the last character is a carriage return `\n'.
$single_student[$i] = $_;`$single_student[]' is a vector quantity, i.e. we are allowed to assign values to `$single_student[0]', `$single_student[1]', `$single_student[2]', etc., etc., etc.. In our case, since on the first read $i is 1 (one), the first line read is assigned to `$single_student[0]'. Before we read another line of the file, we will need to increment `$i'. But, first, we need to process each line read form the external file. First, we extract the three elements, `$last_name[]', `$first_name[]', and this student's password, `$password[]'. So far, we are not going to do anything with this information, but the exercise is just to extract the information, not use it.
$p1 = index($single_student[$i],'+');First, we locate the position of the `+' sign, and place this location in the variable `$p1'.
$last_name[$i] = substr($single_student[$i],0,$p1-1);Next, we take the characters from 0 to $p1-1 and places them (a substr(ing)) into `$last_name[]'. The first character of a string is at location zero (0), and we do not want to include the `+' sign in the student's last name, hence
substr(from_string,starting location,ending location);creates a sub string of the `from_string' of a length chosen by us, starting at a position chosen by us.
$p2 = index($single_student[$i],'+',p1+1); $first_name[$i] = substr($single_student[$i],$p1+1,$p2-1); $password[$i] = substr($single_student[$i],$p2+1);These last three lines locate the second plus sign, create the first name, and then create the password.
print "first_name = ",$first_name[$i]," "; $i = $i + 1;As promised, we increment the variable `$i', so that if it was one, it is now two, if it was 12 then it is now 13.
}; close (STUD_FILE);The last `}' closes the reading loop. When the while statement fails, i.e., there are no more lines to read, then we exit the while loop, and close the file.
#!/usr/local/bin/perl -- -*- C -*- # this is 'read_students.pl' #last_name+first_name+password, where '+' is the delimter $filename = "students_fall_96.dat"; open ( STUD_FILE , $filename) ; $i = 0; while(<STUD_FILE>){ chop;#we are here assuming that there will be a carriage return # at the end of each line, i.e., that we create the file using # an editor. # We may need to change this, since we can use students to # self-register. $single_student[$i] = $_; $p1 = index($single_student[$i],'+'); $last_name[$i] = substr($single_student[$i],0,$p1-1); $p2 = index($single_student[$i],'+',p1+1); $first_name[$i] = substr($single_student[$i],$p1+1,$p2-1); $password[$i] = substr($single_student[$i],$p2+1); #change from first, to print only if there is a name: if($first_name[$i] ne ''){print "first_name = ",$first_name[$i]," ";} #change from first, simplified incrementing: $i++; }; close (STUD_FILE);Before we leave this topic, notice that the student_file, $filename = "students_fall_96.dat" was typed in (by me) by hand. Notice also that in typing it, I ended each line with a Return (CR=\n). This is the file:
stalin+joseph+0659w breznev+leonid+4ofreThe chop then is necessary, for otherwise the password field, which is all the characters beyond $p2+1 would terminate with a carriage return, '\n'.
Perl provides a simpler scheme for parsing the password file, i.e., retrieving the individual parts of the file. The ``split'' function provides the functionality required, parsing the string according to the delimeter (``+'' in our case), and assigning each element to an array element, starting at zero. We then assigns these array items to their individual variables.
#!/usr/local/bin/perl -- -*- C -*- #last_name+first_name+password, where '+' is the delimter $filename = "students_fall_96.dat"; open ( STUD_FILE , $filename) ; $i = 0; while(){ chop;#we are here assuming that there will be a carriage return # at the end of each line, i.e., that we create the file using # an editor. @single_student = split(/\+/); $last_name[$i] = @single_student[0]; $first_name[$i] = @single_student[1]; $pasword[$i] = @single_student[2]; if($first_name[$i] ne ''){print "first_name [$i] = ",$first_name[$i]," ";} $i++; }; close (STUD_FILE);
@single_student = split(/\+/);and notice the `\+' construction. This will be explained later, when we consider regular expressions, but for the time being, you should note that there are certain characters, call them x, in the form (/x/) which are special, and need to be learned with caution. The string from one slash to the next is called a regular expression, and a study of this kind of expression will take a bit of extra work later. Suffice it to say the (/+/) will not work, and (/\+/) will. The ``\'' character is called an escape character. It tells the operating system that the next character is to be taken literally, i.e., not interpreted at all!
Last revision/editing, July 22, 1997