Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

How do I get the Nth Character of a String?

( #4688=categorized question: print w/ replies, xml ) Need Help??
Contributed by vroom on Mar 02, 2000 at 23:38 UTC
Q&A  > strings


Answer: How do I get the Nth Character of a String?
contributed by gridlock

The substr function:
Remember the strings are Zero-Based - i.e. - the first character is character '0', the second character is character '1' and so on....

By that logic, the n-th character is character '(n-1)'

So you're n-th character can be extracted as
$nth = substr($string, n-1, 1);

Answer: How do I get the Nth character of a string?
contributed by vroom

Use substr with a length of one. The character numbering is zero based so the first character in the string is the 0th element.

$str = "123456789"; $first = substr($str, 0, 1); #returns the first character $third = substr($str, 2, 1); #returns the third character
Answer: How do I get the Nth Character of a String?
contributed by btrott

Some might consider using split and an index. The problem with this solution is that it's really slow, particularly as the string gets longer.

Here's some benchmarking code that'll show you:

#!/usr/local/bin/perl -w use strict; use Benchmark; use vars qw/$str/; $str = "123456789asgdjlaskjglkajblnlbnlaqjteoijqotijwojgl;akjglkj"; timethese(shift || 10000, { 'unpack' => sub { my $char = getn_unpack($str, 30) }, 'substr' => sub { my $char = getn_substr($str, 30) }, 'split' => sub { my $char = getn_split($str, 30) } }); sub getn_unpack { return unpack "x" . ($_[1]-1) . "a", $_[0]; } sub getn_substr { return substr $_[0], $_[1]-1, 1; } sub getn_split { return +(split //, $_[0])[$_[1]-1]; }
And here are the benchmark results:
Benchmark: timing 100000 iterations of split, substr, unpack... split: 20 secs (19.39 usr 0.00 sys = 19.39 cpu) substr: 0 secs ( 1.78 usr 0.00 sys = 1.78 cpu) unpack: 2 secs ( 2.89 usr 0.00 sys = 2.89 cpu)
The substr method is, obviously, the fastest, because that's what it's designed to do, basically.

unpack is also quite fast.
split has to split the entire string, construct an array of length($str) elements, then take an index.

So, the best way is to use substr.

Answer: How do I get the Nth Character of a String?
contributed by PetaMem

split is slow. However, if you want just the first character of the string (I often do), then you can significantly speed up split by giving it the value 2 as LIMIT argument.

Benchmarked code from above (obviously on a faster machine) with 1 million iterations:

split: 17 wallclock secs (16.69 usr + 0.02 sys = 16.71 CPU) @ 59 +844.40/s (n=1000000) substr: 0 wallclock secs ( 0.74 usr + 0.00 sys = 0.74 CPU) @ 13 +51351.35/s (n=1000000) unpack: 1 wallclock secs ( 1.02 usr + 0.00 sys = 1.02 CPU) @ 98 +0392.16/s (n=1000000)
Benchmarking a very similar code, but instead looking for the 1st char only and giving split a ,2 limit:
split: 2 wallclock secs ( 1.16 usr + 0.00 sys = 1.16 CPU) @ 86 +2068.97/s (n=1000000) substr: 1 wallclock secs ( 0.70 usr + 0.00 sys = 0.70 CPU) @ 14 +28571.43/s (n=1000000) unpack: 0 wallclock secs ( 0.96 usr + 0.00 sys = 0.96 CPU) @ 10 +41666.67/s (n=1000000)
#!/usr/bin/perl -w use strict; use Benchmark; use vars qw/$str/; $str = "123456789asgdjlaskjglkajblnlbnlaqjteoijqotijwojgl;akjglkj"; timethese(shift || 1000000, { 'unpack' => sub { my $char = getn_unpack($str, 1) }, 'substr' => sub { my $char = getn_substr($str, 1) }, 'split' => sub { my $char = getn_split($str, 1) } }); sub getn_unpack { return unpack "x" . ($_[1]-1) . "a", $_[0]; } sub getn_substr { return substr $_[0], $_[1]-1, 1; } sub getn_split { return +(split //, $_[0],2)[$_[1]-1]; }

Still slower than the other solutions, but nevertheless a speedup of over 10 to an unrestricted split. See if using the LIMIT argument in split would help your code.

Please (register and) log in if you wish to add an answer



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • Outside of code tags, you may need to use entities for some characters:
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others surveying the Monastery: (8)
    As of 2014-08-27 09:53 GMT
    Sections?
    Information?
    Find Nodes?
    Leftovers?
      Voting Booth?

      The best computer themed movie is:











      Results (235 votes), past polls