基本上,我要做的是从一组下载的YouTube视频中提取音频,这些视频的名称(部分地)在用句柄{{1打开的文件(mus.txt)中标识}}。 TXTFILELIST
包含每行视频的一个11个字符的标识符(例如,“dQw4w9WgXcQ”),下载的文件的格式为[title] - [ID] .mp4(在前面的示例中,“Rick阿斯特利 - 永远不会给你 - dQw4w9WgXcQ.mp4“)。
TXTFILELIST
其余的剪切代码有效(我用几个视频检查过,替换变量,评论等),是合法的(我使用了#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...
和strict
pragma),我相信,是无关紧要的,因为它与定义此片段中使用的任何变量(除warnings
之外)无关。然而,这是给我带来麻烦的一点代码;我似乎无法从$opt_extract_audio
中提取TXTFILELIST
中标识的文件。我从其他Stack Overflow回答者那里得到了“问题专栏”的代码,但是由于某些原因它没有用。
TL; DR我想做的是:列出当前目录中的所有文件(比如目录中包含mus.txt,“Rick Astley - 永远不会给你起来 - dQw4w9WgXcQ.mp4”和blah.mp4) ,使用@all_dir_files
(dQw4w9WgXcQ)中的11-char ID仅选择已识别的文件(Rick Astley视频)并从中提取音频。是的,我在Windows上运行此脚本,因此我无法使用TXTFILELIST
或ack
等* nix实用程序。
答案 0 :(得分:3)
去掉grep函数中正则表达式周围的双引号。
答案 1 :(得分:2)
删除行
my @all_dir_files = `dir /b`;
然后使用这个循环:
for my $file (<*${file_to_convert}.mp4>) {
say $file;
system(...);
}
上面的<...>
是一个glob,也可以写成glob "${file_to_convert}.mp4"
。我认为使用perl函数而不是依赖系统调用几乎总是更好。
正如已经指出的那样,"/${file...$/"
不是正则表达式,而是字符串。既然你可以使用带有grep的表达式,并且非空字符串始终为true,那么你的grep基本上什么都不做,并将所有值传递给你的数组。