After James Neal's first goal in a Flames uniform put Calgary ahead 7:32 into the first period, Alexander Steen tied it for the Blues just 12 seconds later.
That was the first of five straight goals for the Blues, whose offensive burst came after they allowed five goals in each of their first two games, both losses.
Perron's first score of the evening came 9:48 into the first period, after collecting a pass from Brayden Schenn, who Schenn assisted on all three of Perron's goals.
Schenn took advantage of a poor clearance attempt from Calgary goalie Mike.Smith during a St. Louis power play in the second period. Schenn beat Smith to the puck and passed to Perron for the score at the 4:05 mark.
The duo connected on another power play with only 36 seconds left in the period, with Perron blasting in a shot from the point.
The hat trick was Perron's fourth. His most recent was also against Calgary on Oct. 22, 2016.
Joel Edmundson scored the Blues' other goal, at 17:22 of the first period. Edmundson was playing in his first game of the season, as a groin injury kept him out of the Blues' first two contests.
Third-period goals from Derek Ryan and Mikael Backlund brought Calgary back within striking distance, though the late surge emphasized the Flames' failure to capitalize on opportunities earlier in the game.
Sean Monahan hit the post while taking a penalty shot in the first period, and the Flames went 0-for-4 on the power play, including a two-man advantage for a 1:35 stretch in the second period.
Blues goalie Jake Allen made 31 saves.
--Field Level Media
(With inputs from agencies.)