Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

nondestructive way to look at a character in a string

by BernieC (Pilgrim)
on Jan 15, 2022 at 20:04 UTC ( [id://11140479]=perlquestion: print w/replies, xml ) Need Help??

BernieC has asked for the wisdom of the Perl Monks concerning the following question:

I *must* be missing something. I want to do a simple check:
if ({nthcharacter of $string} eq "x")
and I can't figure out how to do it. My inclination was to use splice, but splice *removes* the character from the string, so splice($string, n, 1) just won't do. I could do
my @b = split(//, $string) ; if ($b[n] eq "x") {...}
but that seems really klunky. Am I missing some simple/elegant way to do this?

Replies are listed 'Best First'.
Re: nondestructive way to look at a character in a string
by kcott (Archbishop) on Jan 16, 2022 at 11:02 UTC

    G'day BernieC,

    I would have used index for this (rather than the previously suggested substr).

    With index, you are doing exactly what you show in your spec: is the character at a certain position the one you want. With substr, you are extracting a character at a certain position, and then performing a comparison operation.

    The amount of coding for both is the same:

    $ perl -E ' my @x = qw{ABC DEF BXB}; my ($i, $c) = qw{1 B}; for (@x) { say "$_: ", $i == index($_, $c, $i) ? "YES" : "NO"; say "$_: ", $c eq substr($_, $i, 1) ? "YES" : "NO"; } ' ABC: YES ABC: YES DEF: NO DEF: NO BXB: NO BXB: NO

    A Benchmark indicated that index was roughly twice as fast as substr. I used much the same code as I showed above:

    #!/usr/bin/env perl use strict; use warnings; use Benchmark 'cmpthese'; my @x = qw{ABC DEF BXB}; my ($i, $c) = qw{1 B}; cmpthese 0 => { index => sub { $i == index($_, $c, $i) ? 1 : 0 for @x }, substr => sub { $c eq substr($_, $i, 1) ? 1 : 0 for @x }, };

    I ran this three times. All results were very close. The middle was:

    Rate substr index substr 3981142/s -- -46% index 7383385/s 85% --

    — Ken

Re: nondestructive way to look at a character in a string
by Anonymous Monk on Jan 15, 2022 at 20:06 UTC
      Of course. It slipped my mind and when I was flailing around trying to remember it I ran across:
      D:\>perldoc -f substr No Perl script found in input
      And I see my problem now -- for *some* reason, "perldoc -f" does not work from a command prompt when it is in the root of D:. That's for *anything: nothing works from D:. What a crazy thing -- I've tried it cd'ed to a dozen other directories on various other filesystems and it works perfectly.. but not from d:. oh well, now that I see what I did wrong. thanks for reminding my fuzzy mind {and prodding me to realize that perldoc wasn't working in this odd way}

        It's available online at perldoc.perl.org. To wit, substr.

        [doh, this was basically indicated already. I'm being distracted.]

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://11140479]
Approved by LanX
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others about the Monastery: (2)
As of 2024-04-26 04:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found