I don't know Harlowe as well as I know the SugarCube format, but the problem appears to be that you're checking things in the wrong order. You should check to see if they have a hole punched card first, then if they don't have that, check to see if they have a card, then if they don't have that, just comment about the hole puncher.
The problem is that you're doing the "do you have a card" check first, and if that's true, then your code (as it is now) assumes that they need to have the card punched. That's why it's not working.
Basically, you need to make the first thing you check be the last possibility you can get, then the second thing you check should be the second to last possibility you can get, and so on, until you get down to the last "else" and that should be the initial/default situation.
If it helps, think of it as listing responses by priority. You put the highest priority responses first and the lowest priority ones last. So if you're getting the wrong response, then you know you have the priorities in the wrong order, and you need to move the correct response to a higher priority (earlier in the series of if..else checks) than the wrong response you're getting instead.
Hope that helps! :-)