Dhaka:
Perera smashed an unbeaten 80 off 57 balls to lift the tourists from a hopeless 67-8 in the 22nd over to 180 all out after Bangladesh won the toss and elected to field.
Sensing an opening, Sri Lanka hit back to bowl out the hosts for 167 in the 40th over of the rain-curtailed match at the Sher-e-Bangla stadium.
Bangladesh, riding on opener Shamsur Rahman's 62 off 49 balls and 44 from Mominul Haque, were cruising at 114-2 in the 20th over when the batting came apart.
Sri Lankan captain Angelo Mathews claimed three wickets and off-spinner Sachithra Senanayake took two as Bangladesh lost their last eight wickets for 53 runs.
Perera proved to be Sri Lanka's hero after the tourists were left in tatters in a match reduced to 43-overs-a side from the stipulated 50 due to bad weather.
Perera and Senanayake ensured Sri Lanka did not fall below 147, their lowest one-day total against Bangladesh, by adding 82 runs for the ninth wicket.
Perera, who helped Sri Lanka record last-ball wins over Bangladesh in two Twenty20 matches last week, hit six sixes and four boundaries in a superb rearguard action.
Senanayake made 30 as Sri Lanka put on 113 valuable runs for the last two wickets after the spectacular collapse by the top order.
Bangladesh lost Anamul Haque off the second ball of the innings, caught in the slips off Lasith Malinga, but Shamsur and Mominul put on 79 for the second wicket.
Perera, who was named man of the match, broke the threatening stand by having Mominul caught at point for a fluent 44 that contained seven boundaries.
Bangladesh moved to 114-2 in the 20th over when their two main batsmen, Shamsur and Shakib Al Hasan, were run out in the space of five runs.
Shamsur was given out by the third umpire after television replays showed the batsman's feel in the air after his bat got stuck just outside the crease as he went to complete a second run.
Senanayake swung the match Sri Lanka's way by removing Nasir Hossain and Mohammad Mahmudullah in three deliveries to make it 133-6 in the 29th over.
Mathews grabbed three of the last four wickets to seal the victory which came when Robel Hossain became the third Bangladesh batsman to be run out.
Earlier, Bangladesh have won the toss and opted bowl.
Bangladesh have left out Naeem Islam, Shafiul Islam, Mashrafe Mortaza and Tamim Iqbal. Tamim had a neck strain for the past week, so probably that played up.
The match has been reduced to 43 overs a side. The first Powerplay will be nine overs and the second one of four overs.
Earlier, bad weather delayed the start.
The outfield at the drenched Sher-e-Bangla stadium was wet and slippery at the scheduled toss time of 12.30 pm (0630 GMT), amid fears the match may be badly curtailed.
Teams
Bangladesh: Anamul Haque (wk), Shamsur Rahman, Mominul Haque, Mushfiqur Rahim (Capt.), Mahmudullah, Shakib Al Hasan, Nasir Hossain, Sohag Gazi, Al-Amin Hossain, Arafat Sunny, Rubel Hossain.
Sri Lanka: Kusal Perera, Tillakaratne Dilshan, Kumar Sangakkara (wk), Dinesh Chandimal, Ashan Priyanjan, Kithuruwan Vithanage, Angelo Mathews (Capt.), Thisara Perera, Nuwan Kulasekara, Sachitra Senanayake, Lasith Malinga
Brief scores
Sri Lanka: 180 (Thissara Parera 80*)
Bangladesh: 167 (Shamsur Rahman 62, Mathews 3-21)
Result: Sri Lanka won by 13 runs
MOM Thissara Parera (Sri Lanka)