从perl中的工作目录中的某些文件中提取音频

时间:2011-09-19 03:54:53

标签: regex perl

基本上,我要做的是从一组下载的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上运行此脚本,因此我无法使用TXTFILELISTack等* nix实用程序。

2 个答案:

答案 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基本上什么都不做,并将所有值传递给你的数组。