ls (or, in perl,
glob) will work fine if you just need files from a single directory level. Note that you can even use
glob '*/*.txt' so it doesn't even have to be all in the same subdirectory.
If you need files on any level under a root directory, you can indeed call out (on Linux and related) to find, or, in plain perl only, use the standard module File::Find. The latter is probably not as fast, but at least it's cross platform portable.
p.s. Note that in File::Find using a sub named "wanted" is a leftover from its perl-4 heritage, you can name your sub anything, or use an anonymous sub, like this:
my @files;
find sub { push @files, $File::Find::name if -f and /\.txt$/ }, '.';
# now you have an array of file names:
foreach(@files) { ... }