develooper Front page | perl.beginners | Postings from May 2008

Re: how to shorten this code ? x occur how many times in variable

Thread Previous | Thread Next
From:
Richard Lee
Date:
May 7, 2008 11:07
Subject:
Re: how to shorten this code ? x occur how many times in variable
Rob Dixon wrote:
> Richard Lee wrote:
>   
>> John W. Krahn wrote:
>>
>>     
>>> Richard Lee wrote:
>>>
>>>       
>>>> Can you please tell me how to shorten this?
>>>>
>>>> my @an = split(//);
>>>> my @num = grep { $_ eq ':' } @an ;
>>>>
>>>> I was trying to see how many : occur in variable but didn't know how 
>>>> to do it fast so i did it like above...
>>>>
>>>> I would like to see as many way different ways to get this done if 
>>>> possible
>>>>
>>>>
>>>> $var1 = root:x:123:/root:
>>>>
>>>> trying to see how many times : occurs in $var1..... and I could only 
>>>> do it above way....
>>>>         
>>> my $count = $var1 =~ tr/://;
>>>       
>> Talking about reinventing the wheel!!  thank you and I shall try this.. 
>> as I have nver tried tr before.......... thank you!!
>>     
>
> tr/// is in the long tradition of Unix misnomers. It is comparable to s///g, but
> tr(anslates) characters in the first list to those in the second list, so
>
>   $str =~ tr/;:/../;
>
> would replace all colons and semicolons with full stops. It returns the number
> of characters it has translated. However, if there is no character in the
> corresponding position in the second list the character remains unchanged but
> the count is still maintained, so
>
>   $str =~ tr/://;
>
> returns the number of colons found but leaves them untouched. Similarly
>
>   $str =? tr/\t /_/;
>
> translates all tabs to underscores, leaves spaces untouched, and returns the
> total number of either tab or spaces found in the object string.
>
> It is Perl idiom, and you should learn it.
>
> (If you want to be even more obscure then y/// is a synonym for tr///)
>
> HTH,
>
> Rob
>   

this is great!!

use warnings;
use strict;

my $str = 'ab:cd:ef:g:hi::now;';
print $str =~ tr/:// . "\n";
print $str =~ tr/:b/_X/ . "\n";

print "$str\n";


././././././testthis.pl
6
7
aX_cd_ef_g_hi__now;

BTW, what is =?    ? or is that a typo?

$str =? tr/\t /_/;




Thread Previous | Thread Next


Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About