Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Chop command that removes the first character

by mosh (Scribe)
on Oct 26, 2004 at 07:31 UTC ( [id://402493]=perlquestion: print w/replies, xml ) Need Help??

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

Hi Monks, I'm looking for command like chop that removes the first character and not the last one. Is there any ideas ? Thanks !
  • Comment on Chop command that removes the first character

Replies are listed 'Best First'.
Re: Chop command that removes the first character
by BrowserUk (Patriarch) on Oct 26, 2004 at 07:52 UTC

    I have one in my utils library called chip which seems appropriate.

    sub chip{ substr $_[ 0 ], 0, 1, '' } my $s = 'the quick brown fox jumps over the lazy dog'; print chip( $s ), ' : ', $s while $s; t : he quick brown fox jumps over the lazy dog h : e quick brown fox jumps over the lazy dog e : quick brown fox jumps over the lazy dog : quick brown fox jumps over the lazy dog q : uick brown fox jumps over the lazy dog u : ick brown fox jumps over the lazy dog i : ck brown fox jumps over the lazy dog c : k brown fox jumps over the lazy dog k : brown fox jumps over the lazy dog : brown fox jumps over the lazy dog b : rown fox jumps over the lazy dog r : own fox jumps over the lazy dog o : wn fox jumps over the lazy dog w : n fox jumps over the lazy dog n : fox jumps over the lazy dog : fox jumps over the lazy dog f : ox jumps over the lazy dog o : x jumps over the lazy dog x : jumps over the lazy dog : jumps over the lazy dog j : umps over the lazy dog u : mps over the lazy dog m : ps over the lazy dog p : s over the lazy dog s : over the lazy dog : over the lazy dog o : ver the lazy dog v : er the lazy dog e : r the lazy dog r : the lazy dog : the lazy dog t : he lazy dog h : e lazy dog e : lazy dog : lazy dog l : azy dog a : zy dog z : y dog y : dog : dog d : og o : g g :

    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "Think for yourself!" - Abigail
    "Memory, processor, disk in that order on the hardware side. Algorithm, algorithm, algorithm on the code side." - tachyon

      To complete the theme: sub chimp (@) { s!^$/+!! for @_ }

        Ooh! Ooh! Ooh! :)


        Examine what is said, not who speaks.
        "Efficiency is intelligent laziness." -David Dunham
        "Think for yourself!" - Abigail
        "Memory, processor, disk in that order on the hardware side. Algorithm, algorithm, algorithm on the code side." - tachyon
        sub chimp (@) {s!^$/+!! for (@_ ? @_ : $_)}

        chomp() does not remove all trailing record separators, just one. The special case is paragraph mode where all trailing newlines are removed. When in fixed-length record mode ($/ = \$some_int) or slurp mode ($/ = undef) chomp() does nothing. All these special cases aren't handled by &chimp.

        Also, the return value isn't analoguous with chomp()'s.

        ihb

        See perltoc if you don't know which perldoc to read!

Re: Chop command that removes the first character
by Corion (Patriarch) on Oct 26, 2004 at 07:40 UTC

    The naive approach of

    perl -le "$f='hello world'; chop reverse $f; print $f"

    doesn't work sadly, and the correct approach of

    perl -le "$f='hello world'; $f=reverse $f;chop $f;$f=reverse $f; print + $f"

    is far too clumsy, so relying on the fact that substr returns an lvalue, I'd use:

    perl -le "$f='hello world'; substr($f,0,1)=''; print $f"

    Of course, there are many many more methods of removing the first character of a string:

    perl -le "$f='hello world'; $f=~s!^.!!; print $f"

    or

    perl -le "$f='hello world'; $f=~s!.!!; print $f"

    which I guess is the shortest variant, clocking in at 9 characters.

      perl -le "$f='hello world'; $f=~s!^.!!; print $f" perl -le "$f='hello world'; $f=~s!.!!; print $f"

      should be

      perl -le "$f='hello world'; $f=~s!^.!!s; print $f" perl -le "$f='hello world'; $f=~s!.!!;s print $f"

      The first character could be a newline.

Re: Chop command that removes the first character
by insaniac (Friar) on Oct 26, 2004 at 07:46 UTC
    a simple regex will help you, the beauty of perl :-D
    $_="monkey" ; s/^.(.*)$/$1/; print

    hope this helps..
    --
    to ask a question is a moment of shame
    to remain ignorant is a lifelong shame

      Actually you want s/^.//s You need the /s to make a . match *anything* - it does not by default. Also why capture to $1 only to replace it with an exact replica?

        i don't know... i'm just a beginner, beginners make mistakes :-D
        so i'm sorry: i just assumed the first character would never be a newline (that's the only thing the /s does actually.. it allows you to also match a newline with the .)
        --
        to ask a question is a moment of shame
        to remain ignorant is a lifelong shame
Re: Chop command that removes the first character
by mosh (Scribe) on Oct 26, 2004 at 08:37 UTC
    Thanks all. btw, I meant chomp of course...

      I meant chomp of course

      Then you will have to test whether the first character has the value of Perl's special variable   $/   to be removed. See   chomp.

      Cheers, Sören

Re: Chop command that removes the first character
by TedPride (Priest) on Oct 26, 2004 at 07:52 UTC
    EDIT: I was thinking chomp, my bad. The only real possibility is the following, then:
    $varname = substr($varname, 1);
      Hi!

      Chop removes only whitespace...

      What you mean is chomp. chop removes any character.

      EDIT: TedPride: Please don't just delete what you wrote. Now nobody knows what I have been talking about ... as usual :)

      mawe

        Because you have quoted it we know what was there. As a minor pedant chomp will remove any char that corresponds to $/ aka the $INPUT_RECORD_SEPARATOR. For example if you undef $/ but don't localise (or restore) it chomp will mysteriously fail. Not only that it is a global.....

        cheers

        tachyon

Re: Chop command that removes the first character
by TedPride (Priest) on Oct 26, 2004 at 13:35 UTC
    Well then, my original solution works:
    $textvar =~ s/^\s+//;
    I use this one a lot.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others goofing around in the Monastery: (8)
As of 2024-04-23 17:37 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found