Matt Holliday went 3 for 5 with his fourth home run of the season, Brad Penny had his third strong outing and the Cardinals opened a six-game road trip by handing the Diamondbacks their fifth loss in a row, 4-2 Monday night.
Colby Rasmus hit a go-ahead double in the eighth inning, followed two batters later by Arizona first baseman Adam LaRoche's fielding error. Rasmus singled in a run off struggling Chad Qualls in the ninth.
The Cardinals have a reputation for hitting. So far this season, they have been all about pitching. The team has a 2.42 ERA. The top of the rotation -- Chris Carpenter, Adam Wainwright and Penny -- is a combined 7-0 in nine starts.
And the Cardinals have won all four of their series so far.
"We've got great pitching and we've got great catching," Penny said. "They're not even trying to steal bases on us right now. These guys know how to pitch, so it should be a fun year."
Penny (2-0) threw six scoreless innings after the Diamondbacks scored twice in the first. He has allowed three earned runs in 21 innings for a 1.29 ERA.
"He's got a lot of weapons and the catcher knows how to use them," manager Tony LaRussa said. "His delivery is not an easy one to pick up. He's the real deal."
LaRussa was having nothing to do with talk of how great this rotation is.
"That's the kind of stuff you talk about when you get to August and September," he said. "You don't talk about it in April except to say we've gotten off to a good start with our rotation. That's all you can say."
The Cardinals showed how veteran, winning teams find ways to win. The Diamondbacks displayed just the opposite.
"We have guys here in the big leagues that need to make plays and come through when they're given the opportunity," manager A.J. Hinch said. "We can come up with any excuse we want to make us feel better. The bottom line is we have a reminder of whether we win or lose every night."
Lopez, who left after seven with the score tied 2-2, is the fifth Arizona starter in a row not to win despite a strong performance. Those five gave up six earned runs in 30 1/3 innings.
Arizona blew a lead for the sixth time in seven games when Blaine Boyer (1-2) gave up an unearned run in the eighth.
On his second pitch, Rasmus doubled to deep left-center. He advanced to third by Felipe Lopez's sacrifice bunt, then Yadier Molina scorched a grounder off the glove of LaRoche's glove, allowing Rasmus to score.
"That's what we want in that situation," LaRoche said. "I went out and told Blaine let's get a ground ball here. He does it first pitch and I screwed up. I've got to come up with that play. That's bad, bad timing with what we're going through right now. We need some plays like that."
Arizona had a chance to take the lead in the seventh with runners at first and third and one out, but Stephen Drew hit a sharp grounder to second for an easy double play. LaRussa called it a "great pitch."
"I was leaving the ball up that last inning a lot," Penny said. "I was just trying to get a ground ball."
Penny struck out five and walked one in seven innings. Lopez allowed two runs on seven hits.
Drew led off the first with a single, then LaRoche hit a two-out, ground-rule double. Mark Reynolds doubled over the head of Rasmus in center field to bring home both runs.
Arizona twice failed to advance runners to second with sacrifice bunts, by Lopez in the second and by pinch hitter Augie Ojeda in the eighth. Both runners were thrown out at second.
Pujols went 0 or 3 against Lopez with one strikeout and is 0 for 8 against him in his career.
Arizona and St. Louis are tied for the NL lead in homers with 17. ... The Diamondbacks placed LF Conor Jackson on the 15-day DL with a strained right hamstring and recalled RHP Esmerling Vasquez from Triple-A Reno. ... Entering the game, the Diamondbacks bullpen had a 14.34 ERA in the team's four-game skid.