Joe Mauer was 1 for 2 with two walks and is batting .396 for the Twins, who are 38-37 overall but 11-5 in interleague play. Kubel and Cuddyer each had two hits and an RBI, and Perkins, whose previous three career at-bats were strikeouts, contributed a pair of sacrifices.
Adam Wainwright (8-5) also lasted seven innings, his 14th straight start of six-plus innings. He allowed three runs, one unearned. The Cardinals totaled seven hits against four pitchers after averaging 12 runs in Wainwright's three previous starts, all victories.
St. Louis has totaled three runs during a three-game losing streak.
Joe Nathan worked the ninth for his 13th straight save and 18th in 20 chances overall, a key out coming when he struck out Albert Pujols after Colby Rasmus' leadoff double. Nathan hasn't allowed a run in 15 innings in his last 15 appearances.
Perkins (3-4) retired 10 in a row from the last out of the first inning to the last out of the fourth and the Cardinals had only one runner in scoring position the first six innings. Rasmus reached on a bunt hit to start the seventh, sliding to elude the tag of Justin Morneau at first, and scored on Rick Ankiel's two-out double.
Wainwright got two quick outs to start the game before walking Mauer and Morneau, and Kubel broke his bat on an RBI single that gave the Twins the lead. A second run scored when third baseman Joe Thurston booted Cuddyer's two-out grounder and then threw late to first.
Kubel doubled to start the sixth and Cuddyer followed with an RBI single for a 3-0 lead.
Ankiel, the Cardinals' left fielder, saved a run in the third when he threw out Mauer trying to score from second on Cuddyer's two-out single on a tight play.
The Twins and Cardinals are playing for the first time since 2001, when St. Louis swept a three-game series at home. Minnesota has won five straight series openers and has not dropped the opener of an interleague series since June 22, 2007 at Florida.