I've never used Expect.pm, but I have used expect. I've taken a brief perusal of the Expect.pm documentation, but keep in mind this is the first time I've actually written code for it. I notice that the documentation does not have a send() function, only a send_slow(), which seems a bit odd, so there may be another preferred way of sending data with Expect.pm without a pause between characters, but I'm going to use send_slow().
$expectobj = Expect->spawn('telnet', $cisco_hostname)
$expectobj->expect($timeout, 'ogin:');
#the above line assumes the router will give you a login
#prompt which ends in 'ogin:', you may need to modify it
#to fit your needs
$expectobj->send_slow(0, $login_name, "\r\n");
$expectobj->expect($timeout, 'ord:');
$expectobj->send_slow(0, $password, "\r\n");
$expectobj->expect($timeout, $shell_prompt);
#$shell_prompt should be something like '$' or '#' or whatever
#let's you know that you can start typing commands
$expectobj->send_slow(0, "copy startup-config tftp\r\n");
sleep(1); #just to make sure the previous command has been processed
$expectobj->send_slow(0, $remainder_of_data_to_send);
That's it, you should get the idea from there. The documentation for expect should help you understand the Expect.pm documentation as most Expect.pm functions have an expect function of the same name.