The White Sox had forged a 2-2 tie in the top of the eighth when Dewayne Wise grounded a ball through the legs of Royals first baseman Eric Hosmer, allowing Dayan Viciedo and Ray Olemedo to score the tying runs.
But Kansas City came right back in the next half-inning against Jesse Crain (2-2).
Billy Butler led off with a walk, pinch-runner Jarrod Dyson stole second and then came home with the decisive run when Perez sent a single into right-center field.
The Royals added two more insurance tallies en route to completing a three-game series sweep of the American League Central-leading White Sox.
Perez finished with three RBI and Lorenzo Cain added two hits, including a run-scoring single, for the victors.
Greg Holland (6-3) was credited with the win after tossing 1 1/3 scoreless innings.
Royals starter Jeremy Guthrie took a no-hitter in the seventh inning, finishing with two unearned runs allowed on three hits over 7 2/3 frames.