本帖最后由 zm900612 于 2011-5-16 13:37 编辑
23# zm900612
代码过于求奇求异
又缺乏必要的注释
是在考验读者的耐心
我不欣赏这样的风格
qzwqzw 发表于 2011-5-15 21:21 
求奇求异倒不是刻意为之,只是平时喜欢发掘命令的新鲜用法,积累多了,在特定的场合自然会联想到,如果别人不了解我的积累,肯定不容易一下就看明白思路是什么...至于注释,确实没有养成这个代码习惯,以后会注意。
附上对23楼代码的解读:
首先要先说明一下,核心代码来自于前不久研究sort的rec开关时想到的用法: | @echo off&setlocal enabledelayedexpansion | | set n=32768 | | (for %%a in (16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do sort /+100 /rec !n! 1.txt&&set /a n-=%%a||set /a n+=%%a)>nul 2>nul | | ::很像plp兄曾转发过的折半回溯法求字符长度的函数吧?是的,这里就是对那个思路的改造,只不过我是利用sort /rec超过最长行字数时会出错的特性来进行运算的。 | | echo 最长行有%n%个字符 | | pauseCOPY |
但是当时这个代码有个缺点,就是当最长行的字数低于128时,sort /rec的值无论设为多少都是不会出错的。
好在曾经拜读过用findstr实现多色显示的代码,从中获取了灵感,于是23楼代码中就用同样的原理为a.txt中每行补齐128个字符的前缀,这样就绕过了原先的限制
23楼代码为了简化而写得比较晦涩,现在翻译成大众版: | @echo off&setlocal enabledelayedexpansion | | set /a tmp=11,n=4096 | | ::此处的tmp是用于补位的,设成任意两个字符都行,为了压缩代码,把它设成十位数 | | for /l %%a in (1 1 3) do set tmp=!tmp!!tmp!!tmp!!tmp! | | ::将tmp补足128位 | | copy>nul a.txt %tmp:~2%$ | | ::将a.txt保存到一个文件名长度为127个字符的临时文件中 | | findstr .* %tmp:~2%?>$ | | ::用findstr命令配合通配符实现补位,127个字符长的文件名加上“:”号,刚好128个字符,将结果输出到临时文件中 | | for %%a in (2048 1024 512 256 128 64 32 16 8 4 2 1) do ( | | sort /+100 /rec !n! $&&set /a n-=%%a,h=n-128||set /a n+=%%a | | )>nul 2>nul | | ::用sort /rec判断该临时文件最长行的长度 | | for /f "delims=" %%a in ('sort /+%h% a.txt') do set long=%%a | | ::因为知道了最长行的长度,所以可以直接用sort /+n来精确排序,通过for命令,很容易获得最后一行的内容(用set /p也可以,但是考虑到变量长度,还是用for保险,当然用findstr取指定行也是一个不错的选择)。 | | echo !long! | | ::不解释 | | del /f /q *$ | | ::删除临时文件,销赃 | | pauseCOPY |
|