我需要我的perl脚本从SMIL文件中提取jpeg。我所看到的在Linux中执行此操作的唯一方法是使用以下命令。
xxd -c1 -p wapenc\?T\=mavodi-6-13b-1f-4-7c-4806803 | tr "\n" " " | sed -n -e 's/.*\(ff d8 ff .*\)/\1/p' | xxd -r -p > image.jpeg
将其包装在system()调用中不起作用。将这样一系列命令合并到perl中的正确方法是什么?
答案 0 :(得分:3)
在对示例文件进行测试之后,我将oneliner从注释转换为适当的脚本。
脚本的内容是正则表达式/(\xff\xd8\xff.*?\x{ff}\x{d9})/s
,它提取JPEG标头的开始,直到(包括)JPEG标记\xff\xd9
的末尾,同时仍允许换行等。它(/s
修饰符):
#!perl
use strict;
use warnings;
$/ = undef;
my( $filename ) = 'wapenc_T=mavodi-6-13b-1f-4-7c-4806803';
my( $outfilename ) = "$filename-thumbnail.jpeg";
open my $fh, '<:raw', $filename
or die "Couldn't read '$filename': $!";
my $buffer;
{
local $/;
$buffer = <$fh>;
};
open my $output, '>:raw', $outfilename
or die "Couldn't write to '$outfilename': $!";
if( $buffer =~ /(\xff\xd8\xff.*?\x{ff}\x{d9})/s ) {;
print $output $1
};
答案 1 :(得分:0)
将整个命令写入临时文件并执行。
如果愿意,它可以使您在多条语句中构建命令,从而使命令更具可读性。
或者更好的是,在可读管道中运行第一个命令。自己解析数据,而不是在bash管道中将其种植到tr
和 sed
中,与perl相比,这两个数据都非常薄弱。然后将输出定向到可写的popen。
也许您甚至可以找到一个模块,该模块可以让您处理xxd
所做的事情,从而根本不需要它。也许Data::HexDump::XXD?
(没有仔细看,只是想扔出一条快速的,希望有用的线索。)
答案 2 :(得分:-1)
根据jpeg标准,图像的开始和图像标记的结束分别为OxFF OxD8
和0xFF 0xD9
。
因此以下一种班轮应该可以工作
perl -0777 -wne '/(\x{FF}\x{D8}.*?\x{FF}\x{D9})/ and print $1' input.smil > thumbnail.jpeg