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 |
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 |
<lang rexx>/*REXX program demonstrates removal of 1st/last/1st&last chars from a string. */ |
||
@ = 'abcdefghijk' |
|||
say ' the original string =' |
say ' the original string =' @ |
||
say 'string first character removed =' substr( |
say 'string first character removed =' substr(@,2) |
||
say 'string last character removed =' left( |
say 'string last character removed =' left(@,length(@)-1) |
||
say 'string first & last character removed =' substr( |
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 |
<lang rexx>/*REXX program demonstrates removal of 1st/last/1st&last chars from a string. */ |
||
@ = 'abcdefghijk' |
|||
⚫ | |||
say ' |
say ' the original string =' @ |
||
say 'string |
say 'string first character removed =' substr(@,2) |
||
say 'string |
say 'string last character removed =' left(@,max(0,length(@)-1)) |
||
⚫ | |||
⚫ | |||
exit /*stick a fork in it, we're all done. */ |
|||
/* [↓] an easier to read version using a length variable.*/ |
|||
@ = 'abcdefghijk' |
|||
L=length(@) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
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 |
This REXX version is faster (uses '''parse''' instead of multiple BIFs). |
||
<lang rexx>/*REXX program |
<lang rexx>/*REXX program demonstrates removal of 1st/last/1st&last chars from a string. */ |
||
@ = 'abcdefghijk' |
|||
say ' the original string =' |
say ' the original string =' @ |
||
⚫ | |||
say 'string first character removed =' z |
|||
m=length(@)-1 |
|||
⚫ | |||
parse var @ z +(m) |
|||
⚫ | |||
say 'string last character removed =' z |
|||
n=length(@)-2 |
|||
⚫ | |||
parse var @ 2 z +(n) |
|||
⚫ | |||
if n==0 then z= /*handle special case of a length of 2.*/ |
|||
say 'string first & last character removed =' z |
|||
⚫ | |||
'''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> |
||