Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: re-syncing these subtitles

by jwkrahn (Monsignor)
on Sep 05, 2010 at 23:53 UTC ( #858957=note: print w/replies, xml ) Need Help??


in reply to re-syncing these subtitles

open my $fh, "<", $infile or die "error opening '$infile':$?";

The $? variable is not relevant in this context.    You should be using either $! or $^E.


if ( m/^(\d{2}:\d{2}:\d{2},\d+)\s\-\-\>\s(\d{2}:\d{2}:\d{2},\d+)/g + ) {

You are using the /g global option in a scalar context, which would make sense in a while loop, but the value of $_ changes each time you test it so it makes no sense to use it there.


my @elems = split(':', $time); my $seconds = pop @elems; my $minutes = pop @elems; my $hours = pop @elems;

Why not just:

my ( $hours, $minutes, $seconds ) = split /:/, $time;

# force to numerical $hours += 0; $minutes += 0; $seconds += 0;

An unnecessary step as the numbers are already numerical.


my $seconds = sprintf( "%02.3f", ( ( $sectime - ( $hours * 3600 ) +) - ( $minutes * 60 )) );

The number before the period in the format string for floating point is the total width.    So if you want the result to look like '12.345' then you need a format string of '%06.3f' because it has a total width of six characters.


Replies are listed 'Best First'.
Re^2: re-syncing these subtitles
by wazoox (Prior) on Sep 06, 2010 at 09:35 UTC
    The $? variable is not relevant in this context. You should be using either $! or $^E.

    Oh yes, it's always quite easy to mix these up :)

    You are using the /g global option in a scalar context, which would make sense in a while loop, but the value of $_ changes each time you test it so it makes no sense to use it there.

    Well, same as above : quick and dirty script hastily thrown together, not too much testing...

    Why not just: my ( $hours, $minutes, $seconds ) = split /:/, $time;

    Because I want that if you pass only one value, it defaults to seconds, and to minutes:seconds with only two values.

    An unnecessary step as the numbers are already numerical.

    It's a cautionary cleanup in case you're passing garbage as parameters. it will at least avoid mangling hopelessly the output :)

    The number before the period in the format string for floating point is the total width.

    I think you missed the "d" there :). Edit : Well I don't know what's the right form, but "%02.3f" apparently works as intended... ""%05.3f" adds 4 leading zeros.

      It's a cautionary cleanup in case you're passing garbage as parameters.

      Perhaps you should use Scalar::Util::looks_like_number to confirm a numerical value.


      I think you missed the "d" there :)

      There is no letter 'd' in the line:

      my $seconds = sprintf( "%02.3f", ( ( $sectime - ( $hours * 3600 ) +) - ( $minutes * 60 )) );


      Update


      Why not just:
       my ( $hours, $minutes, $seconds ) = split /:/, $time;
      Because I want that if you pass only one value, it defaults to seconds, and to minutes:seconds with only two values.

      Then try it like this:

      my ( $hours, $minutes, $seconds ) = ( split /:/, $time )[ -3, -2, -1 ] +;
        There is no letter 'd' in the line:

        Ooops garbled copy and paste....

        my ( $hours, $minutes, $seconds ) = ( split /:/, $time ) -3, -2, -1 ;

        Nice but too clever for my taste :)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://858957]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (4)
As of 2021-06-24 11:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    What does the "s" stand for in "perls"? (Whence perls)












    Results (127 votes). Check out past polls.

    Notices?