When i run this script i get following Error

bash-4.2$ ./regex.pl
feature version v5.16.0 required--this is only version v1.160.0 at ./
regex.pl line 4.
BEGIN failed--compilation aborted at ./regex.pl line 4.



But I am using perl version as swon below.

bash-4.2$ perl -v

This is perl 5, version 16, subversion 3 (v5.16.3) built for i686-linux

Copyright 1987-2012, Larry Wall

Perl may be copied only under the terms of either the Artistic License or
the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.




On Wed, Sep 17, 2014 at 8:52 AM, Jing Yu <logus...@googlemail.com> wrote:

> Hi Viet-Duc Le,
> On 17 Sep 2014, at 10:23, Viet-Duc Le <leviet...@kaist.ac.kr> wrote:
>
> Greeting from S. Korea !
>
> I am parsing the output of ffmpeg with perl. Particular, I want to print
> only
> these lines among the output and capturing the resolution, i.e. 1280x720.
> ....
>
> Stream #0:0: Video: h264 (High), yuv420p, 1280x720, SAR 1:1 DAR 16:9, 23.98 
> fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
> Stream #0:1(jpn): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s (default)
> Stream #0:2(eng): Subtitle: ass (default)
> .....
>
> My code is following:
> # INFO is pipe to ffmpeg
> # Here, the <print "$1 $2 $3 $4\n"> is for debugging .
> while ( <INFO> ) {
>         if ( <regular expression>  ) {
>             print "$1 $2 $3 $4\n";
>         }
> }
>
> Desirable outputs:
> -> Video 1280 720
>      Audio
>      Subtitle
>
> Regarding the <regular expession>:
> 1. /Stream #\d:\d.*(Video|Audio|Subtitle).*(\d+)x(\d+)/ (greedy)
> -> Video 0 720
>
> Q: why does $2 give  0? I remember .* match backward starting from the end of 
> the string. Then it should be  "Video 1280 720" as output.
>
> that '0' is from 128'0', since the '.*' consumes 128. What it does under
> the hood is .* first will reach to the end of the target string, and then
> backtract according to the following regex. Once the whole regex is
> satisfied, it will stop backtracting, although further retracting will
> possibly also satisfy the regex.
>
>
> 2. /Stream #\d:\d.*(Video|Audio|Subtitle).*?(\d+)x(\d+)/ (non greedy)
> -> Video 1280 720
> Q: I can understand this, but again I think (1) should work too.
>
>
> 3. /Stream #\d:\d.*(Video|Audio|Subtitle).*?(?:(\d+)x(\d+))?/ ( non-capturing 
> optional group )
> -> Video
>     Audio
>     Subtitle
> Q: It seems that the resolution part
> is ignored because it is optional. Otherwise, the output will contains 
> "Video" only as (1) and (2). How can I circumvent this ?
>
> that ?: prevents $ variables to capture the matching regex group. I guess
> you can get rid of it. The trailing ? already tells the regex group to
> match optionally. It is equivalent to {0,1}. The big problem coming with it
> is the middle .*?. Since the last part is optional, .*? will just match the
> least number of char possible, which is nothing.
>
>
> 4. /Stream #\d:\d.*(Video|Audio|Subtitle).+?(?:(\d+)x(\d+))?.*?$/
> -> Video
>      Audio
>      Subtitle
>
> Q: I tried to match things after the resolution, hoping that it will be 
> captured.
>
>
> Again the ?: prevents it being captured. .+? in the middle is better, now
> it matches ':'.
>
>
>
> 5. /Stream #\d:\d.*(Video|Audio|Subtitle).+?(?:(\d+)x(\d+))?(.*?)$/ ( let's 
> capture the last part)
>
> -> Video    h264 (High), yuv420p, 1280x720, SAR 1:1 DAR 16:9, 23.98 fps, 
> 23.98 tbr, 1k tbn, 47.95 tbc (default)
>     Audio    ac3, 48000 Hz, stereo, fltp, 192 kb/s (default)
>     Subtitle    ass (default)
> Q: Now $2 and $3 is undef, and the rest of the string went to $4. Again, I am
> quite puzzled by the output.
>
> If it is optional, it is non greedy. So everything goes to the (.*?)$.
>
>
> Please pardon my long email. I hope someone can point out the flaws in my 
> logic.
> Here, I can match and print Video/Audio/Subtitle separately.
> But I wish for one expression to match them all, one expression to print
> them.
>
> In general, it is a better practise to add 'x' to your regex to make it
> more readable. My regex might not be the best, but it works as expected.
>
> use strict;
> use warnings;
> use 5.16.0;
>
> while(<DATA>){
>     / (Video|Audio|Subtitle)  (?: (?:.) +? (\d+x\d+) || (?:.)+ ) /x
>         and say $1, $2, $3, $4;
> }
>
>
> __DATA__
> Stream #0:0: Video: h264 (High), yuv420p, 1280x720, SAR 1:1 DAR 16:9,
> 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
> Stream #0:1(jpn): Audio: ac3, 48000 Hz, stereo, fltp, 192 kb/s (default)
> Stream #0:2(eng): Subtitle: ass (default)
>
> The '||' operator will first check the group before it. It will only look
> at the other group if the first group fails. This puts your resolution
> group matching as priority, but not necessity.
>
> Hope this helps.
> Jing
>
>


-- 
*********************************************************
Don't ask them WHY they hurt you,
because all they'll tell you is lies and excuses.
 Just know they were wrong, and try to move on.
**********************************************************

Reply via email to