El problema se puede resolver de muchas formas, claro, pero la lógica básica a usar te la puse más arriba, y que RockoX ha reproducido muy bien.
En cuanto a tu programa, solo hay que seguir lo que hace:
Using perl Syntax Highlighting
#!/usr/bin/perl
die "No hay argumentos que leer?\n" unless $ARGV[0
]; # muérete si no hay un primer argumento
die "Escribe?\n" unless $ARGV[1
]; # muérete si no hay un segundo argumento
while (<>) { # Hacemos un bucle por la entrada estándar
# y guardamos cada línea en $_
$_ = pop($otro); # Sacamos el primer elemento del array referenciado
# por $otro y lo guardamos en $_ : ERROR DE COMPILACIÓN
push( @otro, $cambio ); # El valor almacenado en $cambio lo guardamos
# en el array @otro
open ESC
, ">escribir.txt"; # Abrimos un fichero en modo escritura
} # Esto lo repetimos para todas las líneas de la entrada estándar
foreach (%cambio) { # Para todos los valores y claves del hash %cambio
print ESC
"$cambio{$_} \n"; # Escribimos en un fichero supuestamente abierto antes
# el valor correspondiente a $cambio{$_}
} # Repetimos
close ESC
; # Cerramos el fichero abiertoColoreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Vamos... ¡¡¡un jaleo tremendo!!!
* ¿Dónde se han definido las variables $otro, %cambio y $cambio?
* La información que guardamos en @otro no se usa nunca
* Abres el fichero de salida dentro de un bucle de lectura; y eso lo repites por cada línea de entrada
* Lees la línea de entrada en $_ pero en la línea siguiente, ¡te olvidas de ella!
* Creo que no tienes muy claro cómo recorrer los valores de hash
* ¿Un hash he dicho? ¿Para qué usas un hash? ¿Y dónde has creado ese hash?
* Hay un problema también muy gordo: cuando pones '<>', Perl abre el primer fichero indicado en los argumentos, y lo va pasando línea a línea. Y DESPUÉS, abre el SEGUNDO fichero indicado y hace lo mismo.
Necesitas repasar los apuntes
Mira, un truco: si al principio del programa pones estas líneas:
Using perl Syntax Highlighting
use warnings
;
use diagnostics
;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
y, desde la línea de comandos, ejecutas
Using bash Syntax Highlighting
perl -c kk.pl kk1.txt kk2.txt
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Entonces Perl te chiva lo que él cree que está mal:
Using text Syntax Highlighting
Type of arg 1 to pop must be array (not scalar dereference) at kk.pl line 11, near "$otro)"
kk.pl had compilation errors (#1)
(F) This function requires the argument in that position to be of a
certain type. Arrays must be @NAME or @{EXPR}. Hashes must be
%NAME or %{EXPR}. No implicit dereferencing is allowed--use the
{EXPR} forms as an explicit dereference. See perlref.
Uncaught exception from user code:
Type of arg 1 to pop must be array (not scalar dereference) at kk.pl line 11, near "$otro)"
kk.pl had compilation errors.
at kk.pl line 24
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Que quiere decir que: el primer argumento de pop debe ser un array (no un escalar desreferenciado), en la línea 11. Luego te lo reexplica con más detalle. Y luego se muere.
Si, además, pones como primera línea ejecutable del programa esta otra:
Using perl Syntax Highlighting
use strict
;Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Entonces Perl trabaja en modo estricto, y nos dará más información:
Using text Syntax Highlighting
explorer@next3:~/Documents/desarrollo> perl -c kk.pl kk1.txt kk2.txt
Global symbol "$otro" requires explicit package name at kk.pl line 11.
Type of arg 1 to pop must be array (not scalar dereference) at kk.pl line 11, near "$otro)"
Global symbol "@otro" requires explicit package name at kk.pl line 13.
Global symbol "$cambio" requires explicit package name at kk.pl line 13.
Global symbol "%cambio" requires explicit package name at kk.pl line 17.
Global symbol "%cambio" requires explicit package name at kk.pl line 18.
kk.pl had compilation errors (#1)
(F) You've said "use strict vars", which indicates that all variables
must either be lexically scoped (using "my"), declared beforehand using
"our", or explicitly qualified to say which package the global variable
is in (using "::").
Uncaught exception from user code:
Global symbol "$otro" requires explicit package name at kk.pl line 11.
Type of arg 1 to pop must be array (not scalar dereference) at kk.pl line 11, near "$otro)"
Global symbol "@otro" requires explicit package name at kk.pl line 13.
Global symbol "$cambio" requires explicit package name at kk.pl line 13.
Global symbol "%cambio" requires explicit package name at kk.pl line 17.
Global symbol "%cambio" requires explicit package name at kk.pl line 18.
kk.pl had compilation errors.
at kk.pl line 24
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Y salen todos los errores comentados antes, sobre todo, todas las variables que Perl se encuentra de sopetón.
Esas tres líneas de 'use' son imprescindibles para cualquier programador nuevo en Perl, pues el intérprete perl le ayudará mucho.
Si te es más fácil, puedes resolver el problema usando los bucles
for() con tres parámetros, recorriendo los elementos almacenados en el array, pero en orden inverso.
RockoX ya te ha dado una solución, pero no podemos resolverte el tema porque tu profesor seguramente estará leyendo esto también, así que no te valdrá lo que te digamos de forma directa.
Lo principal, a la hora de programar, es tener claro el plan general, y resolverlo paso a paso. A veces es interesante, al principio, resolverlo con lápiz y papel.
En cuanto a lo de cabrón, aquí en España solemos decir "¡Pero qué cabrón (que) es...!" Eso sí, no significa lo mismo si lo dices enfadado o con admiración.
Lo bueno del Español es que tenemos un idioma muy rico, y cada país tiene sus variaciones, que lo hacen aún más rico -a pesar de algún pequeño cambio de significado de algunas palabras
-.