Basically, what I’m trying to do is extract the audio from a set of downloaded YouTube videos, the names of which are (partially) identified in a file (mus.txt) that was opened with the handle TXTFILELIST. TXTFILELIST contains one 11-character identifier for the video on each line (for example, “dQw4w9WgXcQ”) and the downloaded file is of the form [title]-[ID].mp4 (in the previous example, “Rick Astley – Never Gonna Give You Up-dQw4w9WgXcQ.mp4”).
#snip...
if ($opt_extract_audio) {
open(TXTFILELIST, "<", "mus.txt") or die $!;
my @all_dir_files = `dir /b`;
my $file_to_convert;
foreach $file_to_convert (<TXTFILELIST>) {
my @files = grep("/${file_to_convert}\.mp4$/", @all_dir_files); #the problem line!
print "files: @files\n";
foreach $file (@files) {
system("ffmpeg.exe -i ${file} -vn -y -acodec pcm_s16le -ac 2 ${file}.wav");
}
}
#snip...
The rest of the snipped code works (I checked it with several videos, replacing vars, commenting, etc.), is legal (I used the strict and warnings pragmas) and, I believe, is irrelevant, because it has nothing to do with defining any vars (besides $opt_extract_audio) used in this snippet. However, this is the one bit of code that’s giving me trouble; I can’t seem to extract the files that are identified in TXTFILELIST from @all_dir_files. I got the code for ‘the problem line’ from other Stack Overflow answerers, but it isn’t working for some reason.
TL;DR What I want to do is this: list all files in the current dir (say the directory contains mus.txt, “Rick Astley – Never Gonna Give You Up-dQw4w9WgXcQ.mp4”, and blah.mp4), choose only the identified file(s) (the Rick Astley video) using the 11-char ID in TXTFILELIST (dQw4w9WgXcQ) and extract the audio from it. And yes, I am running this script on Windows, so I can’t use *nix utilities like ack or find.
Remove the line
And use this loop instead:
The
<...>above is a glob, can also be writtenglob "${file_to_convert}.mp4". I think it is almost always better to use perl functions rather than rely on system calls.As has been pointed out,
"/${file...$/"is not a regex, but a string. And since you can use expressions with grep, and a non-empty string is always true, your grep will essentially do nothing, and pass all the values into your array.