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.