$clk_new = join '_', $clk_output[$c];
You were almost there: $clk_output[$c] is a scalar that happens to contain an array reference, but join doesn't know that, since it takes a list. Dereference the scalar so it is transformed into a list in a function call, and the join works: join '_', @{$clk_output[$c]}.
You could also use a similar map construct to construct @clk_new with less code (C-style for loop in Perl is usually a sign of potential improvements): my @clk_new = map { join "_", @$_ } @clk_output;
All code is untested, sorry.