Zach Sanford had a goal and an assist for the Blues (31-12-8), who were 0-2-1 in their previous three games, including a 3-1 loss at the Vancouver Canucks on Monday. Jordan Binnington made 27 saves.
"I'm just happy we find a way to win games," Perron said. "Hopefully, we're winning each of our games from now on, but maybe that gets it started and we don't even talk about how we won this one. It's two points."
[WATCH: All Blues vs. Flames highlights]
Sean Monahan scored two goals, and Johnny Gaudreau had two assists for the Flames (26-19-6), who have lost three of their past four games (1-2-1) after winning five straight. Cam Talbot made 30 saves in Calgary's first game since Jan. 18.
"That's a tough team to play the first game back, but I thought we did some good things," Gaudreau said. "There's still, obviously, room for improvement, but I thought it was a good effort."
After Perron scored in the first round of the shootout, Ryan O'Reilly beat Talbot five-hole in the bottom of the second to end the game. Monahan missed in the first round, and Binnington made the save against Matthew Tkachuk in the second.
"I don't know what I'm doing before this one," Perron said. "Sometimes, I have a move in my head. I kind of had a feeling I would have to shoot that one the way the ice was. For me, I didn't feel comfortable making too much of a move. It went in. It's good."
Video: STL@CGY: Perron bangs in rebound
The Flames went 3-for-4 on the power play, failing to score in overtime after Perron was called for holding Tkachuk at 2:56.
Alexander Steen one-timed a return pass from Robert Thomas on the rush to put St. Louis up 1-0 at 5:45 of the first period, and Tkachuk scored his first goal in 11 games on the power play to tie it 1-1 at 10:38.
Monahan got his 400th NHL point when he scored on the power play with a wrist shot from the slot to put Calgary up 2-1 at 15:43. It was his first goal in eight games.
Perron tied it 2-2 at 18:41 when he scored on the rebound of a Sanford shot.
Jaden Schwartz, playing in his 500th NHL game, put the Blues up 3-2 at 19:25 when he redirected Brayden Schenn's pass eight seconds into a power play.
"The first bit of the game, we were awesome," Tkachuk said. "Then they scored, and we got two more, and I thought we were playing well at that point, but then a bad end to the first period."
Video: STL@CGY: Schwartz taps in Schenn's feed for PPG
Monahan scored his second of the game on the power play to tie it 3-3 at 4:40 of the second period, and Mark Jankowski gave the Flames a 4-3 lead at 9:47 when he scored his second goal in as many games after going without one in his first 38 games of the season.
"The first and second period wasn't the greatest hockey," Perron said. "We talked about it. If we get the first goal in the third, we give ourselves a really good chance at getting the two points, and that's what we did."
Sanford tied it 4-4 with a shot over Talbot's glove from the right face-off circle 51 seconds into the third period.
Perron scored at 3:29 of the third, but Calgary coach Geoff Ward challenged for offside, and video review showed O'Reilly entered the zone ahead of the puck at 3:26.
"That's a mental error by me," O'Reilly said. "It's a stupid play by myself. I'm better than that. I can hold on to the puck for an extra split second and get that line and then kick it. It's embarrassing. I feel bad for [Perron]. It was a great shot."
Steen left the game at 17:15 of the second period after the forward sustained a lower-body injury.
Video: STL@CGY: Tkachuk nets one-timer for PPG
They said it
"It's tough to come off [the break] and have two back-to-back games against teams that play heavy and have speed. It's tough, but we have to find the staples of our game and get to our structure. It is good though. We got two points tonight. Last night (against the Canucks), they were available, and we didn't get them. We have to keep building and keep growing our game and get back on track here." -- Blues center Ryan O'Reilly
"You can tell that teams coming off nine days off aren't the sharpest. You can tell there's some execution issues, coverage and stuff both ways. Coming out of the break, that's kind of what you expect, I guess. We got one big point, but we needed the second." -- Flames goalie Cam Talbot
Video: STL@CGY: Monahan scores PPG for 400th NHL point
Need to know
Steen's goal was his 494th point with the Blues, passing Pavol Demitra for fifth in St. Louis history. ... The Blues, who were 1-for-2 on the power play, are 13-4-2 in their past 19 games. ... St. Louis forward Sammy Blais had four hits in 11:01 in his return after missing 28 games with an injured right wrist. ... Monahan is the 18th player in Flames history to reach 400 points. ... Calgary forward Buddy Robinson had two shots on goal, two hits and one blocked shot in 15:31 in his first NHL game since Dec. 10, 2016, with the Ottawa Senators.
Blues: At the Edmonton Oilers on Friday (9 p.m. ET; SNW, FS-MW, NHL.TV)
Flames: At the Edmonton Oilers on Wednesday (10 p.m. ET; SN360, SNE, SNO, SNW, TVAS, NHL.TV)
Video: Blues rally to defeat Flames in shootout