本帖最后由 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%个字符
- pause
复制代码 但是当时这个代码有个缺点,就是当最长行的字数低于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 *$
- ::删除临时文件,销赃
- pause
复制代码
|