Substring/Top and tail: Difference between revisions

Content added Content deleted
m (→‎error prone: used zero instead of 0 (in a REXX section header comment)..)
m (→‎{{header|REXX}}: added/changed whitespace and comments, added a faster version, added a version for easier reading.)
Line 1,041: Line 1,041:
=={{header|REXX}}==
=={{header|REXX}}==
===error prone===
===error prone===
This REXX version is error prone in that if the   '''z'''   string is either null (zero length) or is only one byte, then the '''left''' and '''substr''' BIFs will fail   (invalid '''length''' specified).
This REXX version is error prone in that if the string is less than two characters, then the   '''left'''   and/or   '''substr'''   BIFs will fail   (because of an invalid length specified).
<lang rexx>/*REXX program to show removal of 1st/last/1st&last chars from a string.*/
<lang rexx>/*REXX program demonstrates removal of 1st/last/1st&last chars from a string. */
z = 'abcdefghijk'
@ = 'abcdefghijk'
say ' the original string =' z
say ' the original string =' @
say 'string first character removed =' substr(z,2)
say 'string first character removed =' substr(@,2)
say 'string last character removed =' left(z,length(z)-1)
say 'string last character removed =' left(@,length(@)-1)
say 'string first & last character removed =' substr(z,2,length(z)-2)
say 'string first & last character removed =' substr(@,2,length(@)-2)
/*stick a fork in it, we're done.*/
/*stick a fork in it, we're all done. */


/* ╔═══════════════════════════════════════════════════════╗
/*╔═════════════════════════════════════════════════════╗
║ However, the original string may be null or exactly ║
However, the original string may be null or exactly
║ one byte in length which will cause the BIFs to ║
one byte in length which will cause the BIFs to
║ fail because of either zero or a negative length.║
fail because of either zero or a negative length.
╚═══════════════════════════════════════════════════════╝ */</lang>
╚═════════════════════════════════════════════════════╝*/</lang>
'''output'''
'''output'''
<pre>
<pre>
Line 1,064: Line 1,064:


===robust version===
===robust version===
This REXX version correctly handles a string of zero (null) or one byte.
<lang rexx>/*REXX program to show removal of 1st/last/1st&last chars from a string.*/
<lang rexx>/*REXX program demonstrates removal of 1st/last/1st&last chars from a string. */
z = 'abcdefghijk'
@ = 'abcdefghijk'
say ' the original string =' z
say 'string first character removed =' substr(z,2)
say ' the original string =' @
say 'string last character removed =' left(z,max(0,length(z)-1))
say 'string first character removed =' substr(@,2)
say 'string first & last character removed =' substr(z,2,max(0,length(z)-2
say 'string last character removed =' left(@,max(0,length(@)-1))
say 'string first & last character removed =' substr(@,2,max(0,length(@)-2))
/*stick a fork in it, we're done.*/</lang>
exit /*stick a fork in it, we're all done. */

/* [↓] an easier to read version using a length variable.*/
@ = 'abcdefghijk'
L=length(@)
say ' the original string =' @
say 'string first character removed =' substr(@,2)
say 'string last character removed =' left(@,max(0,L-1))
say 'string first & last character removed =' substr(@,2,max(0,L-2))</lang>
'''output''' is the same as the 1<sup>st</sup> REXX version.
'''output''' is the same as the 1<sup>st</sup> REXX version.


===faster version===
===faster version===
This REXX version is slightly faster (for removing the 1st character from a string).
This REXX version is faster &nbsp; (uses &nbsp; '''parse''' &nbsp; instead of multiple BIFs).
<lang rexx>/*REXX program to show removal of 1st/last/1st&last chars from a string.*/
<lang rexx>/*REXX program demonstrates removal of 1st/last/1st&last chars from a string. */
z = 'abcdefghijk'
@ = 'abcdefghijk'
say ' the original string =' z
say ' the original string =' @

parse var @ 2 z
say 'string first character removed =' z


m=length(@)-1
parse var z 2 zz
parse var @ z +(m)
say 'string first character removed =' zz
say 'string last character removed =' z


n=length(@)-2
say 'string last character removed =' left(z,max(0,length(z)-1))
parse var @ 2 z +(n)
say 'string first & last character removed =' substr(z,2,max(0,length(z)-2
/*stick a fork in it, we're done.*/</lang>
if n==0 then z= /*handle special case of a length of 2.*/
say 'string first & last character removed =' z
/*stick a fork in it, we're all done. */</lang>
'''output''' is the same as the 1<sup>st</sup> REXX version. <br><br>
'''output''' is the same as the 1<sup>st</sup> REXX version. <br><br>