Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Re: re-syncing these subtitles

by jwkrahn (Abbot)
on Sep 05, 2010 at 23:53 UTC ( [id://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
Domain Nodelet?
Node Status?
node history
Node Type: note [id://858957]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (6)
As of 2024-03-29 12:45 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found