On Sat, Nov 27, 1999 at 11:06:01AM -0800, Don Arbow wrote: > On 11/27/99 at 1:31 AM, Nicholas G. Thornton wrote: > : $back = $bug =~ tr/\.\.\//\.\.\//; > First, you're not using translate correctly. You appear to want to > count '../', but in this case that is not what translate does. When you > use =~, translate modifies $bug and assigns that modified string to > $back, it does not return the count. In order to count using tr///, your > string needs to be in $_ and you must assign the count using =. But > translate only counts single character replacements, not patterns. So > each translation of '../' would return 3. This is almostly entirely incorrect. The =~ operator allows you to use tr/// (and m// and s///) on any scalar value, not just $_. However, use of =~ does _not_ affect tr///'s return value. $back = $bug =~ tr/\.\.\//\.\.\//; does not assign the modified string to $back. The expression modifies the value of $bug _in-place_, and assigns the return value of tr/// to $back. The return value of tr/\.\.\//\.\.\// here is not 3. The target string in the example is "../images/images.", which contains three periods and two forward slashes, so the return value is 5. > Use the substitute operator with the global option instead. But first > you'll have to move your string into $_. So your code above should look > like this: You don't have to assign the string to $_, but you can if you want to. If you want to user another variable, the =~ operator allows you to do so. > if ($_ =~ /<IMG usemap="#map1" src="(.*)titlebar\.GIF" width="467" height="60" > border="0" align="top">/) { > $_ = $1; > $back = s/\.\.\//\.\.\//g; It would be more correct to only count occurences of ../ at the beginning of the string. if ($_ =~ /<IMG\ usemap="#map1"\ src="(.*)titlebar\.GIF"\ width="467" \ height="60"\ border="0"\ align="top">/x) { my $path = $1; $count++ while $path =~ m,\G\.\./,g; Ronald # ===== Want to unsubscribe from this list? # ===== Send mail with body "unsubscribe" to macperl-request@macperl.org