when i change
use 5.16.0; to use feature ':5.10';

it works i get following output

bash-4.2$ ./regex.pl
Use of uninitialized value $3 in say at ./regex.pl line 7, <DATA> line 1.
Use of uninitialized value $4 in say at ./regex.pl line 7, <DATA> line 1.
Video1280x720
Use of uninitialized value $2 in say at ./regex.pl line 7, <DATA> line 2.
Use of uninitialized value $3 in say at ./regex.pl line 7, <DATA> line 2.
Use of uninitialized value $4 in say at ./regex.pl line 7, <DATA> line 2.
Audio
Use of uninitialized value $2 in say at ./regex.pl line 7, <DATA> line 3.
Use of uninitialized value $3 in say at ./regex.pl line 7, <DATA> line 3.
Use of uninitialized value $4 in say at ./regex.pl line 7, <DATA> line 3.
Subtitle


how these two use statements differ.

use 5.16.0;

perl regex.pl works

why ./regex.pl doesnt work.

it gives following error
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.



On Wed, Sep 17, 2014 at 2:38 PM, Uday Vernekar <vernekaru...@gmail.com>
wrote:

> 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.
> **********************************************************
>



-- 
*********************************************************
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