Other Data Transformation
- Here's one way to do it:
while (<>) { chomp; $slash = rindex($_,"/"); if ($slash > -1) { $head = substr($_,0,$slash); $tail = substr($_,$slash+1); } else { ($head,$tail) = ("", $_); } print "head = '$head', tail = '$tail'\n"; }
Each line read by the diamond operator is first chomped (tossing the newline). Next we look for the rightmost slash in the line, using
rindex(). The next two lines break the string apart usingsubstr(). If there's no slash, the result of therindexis-1, so we hack around that. The final line within the loop prints the results. - Here's one way to do it:
chomp(@nums = <STDIN>); # note special use of chomp @nums = sort { $a <=> $b } @nums; foreach (@nums) { printf "%30g\n", $_; }
The first line grabs all of the numbers into the
@numsarray. The second line sorts the array numerically, using an inline definition for a sorting order. Theforeachloop prints the results. - Here's one way to do it:
open(PW,"/etc/passwd") || die "How did you get logged in?"; while (<PW>) { chomp; ($user, $gcos) = (split /:/)[0,4]; ($real) = split(/,/, $gcos); $real{$user} = $real; ($last) = (split /\s+/, $real)[-1]; $last{$user} = "\L$last"; } close(PW); for (sort by_last keys %last) { printf "%30s %8s\n", $real{$_}, $_; } sub by_last { ($last{$a} cmp $last{$b}) || ($a cmp $b) }The first loop creates
%lasthash, consisting of login names for keys and user's last names for the corresponding values, and the%realhash, containing the full real names instead. The last names are all converted to lowercase, so that FLINTSTONE, Flintstone, and flintstone all sort near each other.The second loop prints
%realout, ordered by the values of%last, using the sort definition presented inby_lastsubroutine. - Here's one way to do it:
while (<>) { substr($_,0,1) =~ tr/a-z/A-Z/; substr($_,1) =~ tr/A-Z/a-z/; print; }
For each line read by the diamond operator, we use two
troperators, each on a different portion of the string. The firsttroperator uppercases the first character of the line, and the secondtroperator lowercases the remainder. The result is printed.Here's another way to do this, using only double-quoted string operators:
while (<>) { print "\u\L$_"; }Give yourself an extra five points if you thought of that instead.