Perron's first of the night at 17:12 of the first period came against Joey MacDonald, who took over in the Flames net for starter Leland Irving just over four minutes into the game after St. Louis scored on two of its first four shots.
Calgary tried to fight back in the second outshooting the Blues 15-5, but were only able to solve rookie Jake Allen once when Dennis Wideman ripped rising slapshot through a crowd.
The Flames scored again 2:46 into the third when Curtis Glencross was set up neatly by Jarome Iginla, but Mark Giordano's interference penalty 17 seconds later put the Blues' top-ranked power play back on the ice and St. Louis took advantage. Perron took a pass at centre from T.J. Oshie and, just after crossing the blue-line, fired a wrist shot into the top corner.
Rookie Jaden Schwartz, with his first of the season, Patrik Berglund and Alex Steen also scored for St. Louis (8-5-1). After going winless in five, the Blues have won two in a row and will try to make it a perfect three-game road trip when they play Vancouver on Sunday.
Calgary (4-4-3) lost in regulation for the first time in four games. The Flames head out on a short road trip that sees them play in Dallas on Sunday and Phoenix on Monday.
Despite all the scoring at one end, the play that had the Scotiabank Saddledome sellout crowd of 19,289 buzzing was a first-period save by Allen off T.J. Brodie, which could very well end up being the save of the season.
Calgary burst into the Blues' end on an odd-man rush and, in a slick display of passing, Jiri Hudler sent the puck to Alex Tanguay in the slot, who promptly zipped it back to Hudler. He quickly fired it back across to Brodie, who was breaking in and staring at an open net.
However, Allen darted across, reached out with his goal stick and knocked the puck out of the air with his paddle, with the puck fluttering high up in the air before the 22-year-old caught it nonchalantly with his glove to leave an exasperated Brodie shaking his head in disbelief.
Allen, making his second straight career start, finished the night with 30 saves to improve to 2-0.
MacDonald, who finished with 18 saves, was tagged with the loss.
Calgary started fast Wednesday with a 4-1 lead after the first period in a 7-4 win over Dallas, but the opposite happened against the Blues who scored four times in the opening 20 minutes.
Schwartz opened the scoring at 1:28 on his first of the year. Steen made a great play to keep the puck in at the blue-line then found Schwartz behind the Flames' defence where the rookie made a slick move to his backhand to beat Irving.
Less than three minutes later, Schwartz was at it again, this time intercepting Wideman's clearing attempt along the boards and sending a pass to Berglund in front, where he fired his team-leading seventh goal.
That brought Irving's evening to an abrupt end with the Flames rookie goaltender leaving after he stopped 2-of-4 shots.
Making his Flames debut was 33-year-old journeyman MacDonald, who kept the Blues off the scoreboard for over nine minutes before Steen scored at 13:49.
St. Louis finished 2 for 4 on the power play. It was the eighth consecutive game the Blues have connected with the extra man, going an impressive 12 for 32 over that stretch.
Calgary, which entered the night with the league's second best power play, went 1 for 4.
Notes: Schwartz's dad was at the game. ... The Blues announced that RW Jamie Langenbrunner underwent successful hip surgery. The 37-year-old is lost for the season. ... Iginla played in career game No. 1,200. ... Flames D Jay Bouwmeester extended his iron man streak to 600 games. It is the NHL's longest active streak. Doug Jarvis holds the all-time mark of 964 games. ... Calgary D Anton Babchuk made his season debut.