Perl job interview questions (1)
10. Using Perl to replace bar by baz in fileA.
to replace first bar in fileA:perl -pi -e 's/bar/baz/' fileA
to replace all bar:
perl -pi -e 's/baz/bar/g' fileA
(-p: assume loop like -n but print line also, like sed;
-e: one line of program
-i[extension]: edit <> files in place (makes backup if extension supplied)
perl -pi'.bak' -e 's/bar/baz/g' fileA
copy old fileA to fileA.bak, then replace all bar in fileA
11. Assign 50 to scalar price and output price and current time.
#!/usr/bin/perl# by jiansen
$Price=50;
$day_of_year = (localtime(time()));
print <<EOF;
Today is $day_of_year.
The price is $Price.
EOF
12. Input two numbers and output the sum.
#!/usr/bin/perlprint "Type in first number: ";
$x = <stdin>;
chop($x);
print "Type in second number: ";
$y = <stdin>;
chop($y);
$z = $x + $y;
print "$x + $y = $z\n";
13. The same as question 12, add a choice "do it again" to repeat or stop.
#!/usr/bin/perl$doagain = "yes";
while($doagain eq "yes") {
$x = &getnumber;
$y = &getnumber;
$z = $x + $y;
print "$x + $y = $z\n";
print "Do it again? (yes or no) ";
$doagain = <STDIN>;
chop($doagain);
}
sub getnumber {
print "Type in a number: ";
$number = <STDIN>;
chop($number);
$number;
}
14. Input a series of number, until ctrl D to stop and output the sum.
#!/usr/bin/perlprint " input a number (ctr D to stop)\n";
while (<>) {
print " input a number\n";
$total += $_;
}
print " The total is $total.\n";
15. Search for a file in a directory and its sub-directories.
#!/usr/bin/perl# search for a file in all subdirectories
if ($#ARGV != 1) {
print "usage: find_file filename directory\n";
exit;
}
$filename = $ARGV[0];
# look in the directory
$dir = $ARGV[1];
&searchDirectory($dir);
sub searchDirectory {
local($dir);
local(@lines);
local($line);
local($file);
local($subdir);
$dir = $_[0];
# check for permission
if(-x $dir) {
# search this directory
@lines = `cd $dir; ls -l | grep $filename`;
foreach $line (@lines) {
$line =~ /\s+(\S+)$/;
$file = $1;
print "Found $file in $dir\n";
}
# search any sub directories
@lines = `cd $dir; ls -l`;
foreach $line (@lines) {
if($line =~ /^d/) {
$line =~ /\s+(\S+)$/;
$subdir = $dir."/".$1;
&searchDirectory($subdir);
}
}
}
}
16.Difference between s/foo/bar/; s/foo/bar/g; s/foo/bar/gi; if(m/foo/)...
s/foo/bar/;
replaces the first occurrence of the exact character sequence foo with bar;
s/foo/bar/g;
replaces any occurrence of the exact character sequence foo;
s/foo/bar/gi;
replaces any occurrence of foo case-insensitively in the “current string”;
if(m/foo/)...
tests whether the current string contains the string foo.
17. Check user login status using system.
#!/usr/bin/perl
#checkuser.pl
# check user login status
#
if ($#ARGV != 0) {
print "usage: checkuser.pl user\n";
exit;
}
$user = $ARGV[0];
$cmd = "last |grep $user";
print $cmd."\n";
if(system($cmd)) { print "$user does not exsit\n"; }
18. Does Perl have reference type?
Yes. Perl can make a scalar or hash type reference by using backslash operator.
For example
$str = "here we go"; # a scalar variable
$strref = \$str; # a reference to a scalar
@array = (1..10); # an array
$arrayref = \@array; # a reference to an array
Note that the reference itself is a scalar.
19. How do I do < fill-in-the-blank > for each element in a hash?
#!/usr/bin/perl -w
%days = (
'Sun' =>'Sunday',
'Mon' => 'Monday',
'Tue' => 'Tuesday',
'Wed' => 'Wednesday',
'Thu' => 'Thursday',
'Fri' => 'Friday',
'Sat' => 'Saturday' );
foreach $key (sort keys %days) {
print "The long name for $key is $days{$key}.\n";
}
20. Regular expressions in Perl.
Metacharacters
char | meaning |
---|---|
^ | beginning of string |
$ | end of string |
. | any character except newline |
* | match 0 or more times |
+ | match 1 or more times |
? | match 0 or 1 times; or: shortest match |
| | alternative |
( ) | grouping; “storing” |
[ ] | set of characters |
{ } | repetition modifier |
\ | quote or special |
Repetition
a* | zero or more a’s |
a+ | one or more a’s |
a? | zero or one a’s (i.e., optional a) |
a{ m} | exactly m a’s |
a{ m,} | at least m a’s |
a{ m, n} | at least m but at most n a’s |
repetition? | same as repetition but the shortest match is taken |
Special notations with \
|
|
\w | matches any single character classified as a “word” character (alphanumeric or “_ ”) |
\W | matches any non-“word” character |
\s | matches any whitespace character (space, tab, newline) |
\S | matches any non-whitespace character |
\d | matches any digit character, equiv. to [0-9] |
\D | matches any non-digit character |
Examples
expression | matches... |
---|---|
abc | abc (that exact character sequence, but anywhere in the string) |
^abc | abc at the beginning of the string |
abc$ | abc at the end of the string |
a|b | either of a and b |
^abc|abc$ | the string abc at the beginning or at the end of the string |
ab{2,4}c | an a followed by two, three or four b ’s followed by a c |
ab{2,}c | an a followed by at least two b ’s followed by a c |
ab*c | an a followed by any number (zero or more) of b ’s followed by a c |
ab+c | an a followed by one or more b ’s followed by a c |
ab?c | an a followed by an optional b followed by a c ; that is, either abc or ac |
a.c | an a followed by any single character (not newline) followed by a c |
a\.c | a.c exactly |
[abc] | any one of a , b and c |
[Aa]bc | either of Abc and abc |
[abc]+ | any (nonempty) string of a ’s, b ’s and c’s (such as a , abba , acbabcacaa ) |
[^abc]+ | any (nonempty) string which does not contain any of a , b and c (such as defg ) |
\d\d | any two decimal digits, such as 42 ; same as \d{2} |
\w+ | a “word”: a nonempty sequence of alphanumeric characters and low lines (underscores), such as foo and 12bar8 and foo_1 |
No comments:
Post a Comment