批处理之家's Archiver

CrLf 发表于 2014-10-2 22:06

powershell 输出 a~z 和 aa~zz

powershell 借鉴了 perl 的许多语法,比如 .. 范围操作符
在 perl 中,列举从 a~z 的字符可以这样:[code]print 'a'..'z';[/code]但 powershell 使用 'a'..'z' 则会报错 [color=Red]无法将值“a”转换为类型“System.Int32”。错误:“输入字符串的格式不正确。”[/color]
这是因为 'a' 是一个字符串(system.string 类型),而且不是合法的二进制、八进制、十进制或十六进制数字格式
也就是说,咱可以这样:[code][char[]]([char]'a'..[char]'z') -join ''[/code]略麻烦,不过反正实现了,有疑惑的童鞋可以参考附文部分的解释

拔特,perl 的范围运算符还有这样的用法:[code]@arr = 'aa'..'zz';
print "@arr";[/code]尼玛还能这样得到组合?perl 也太犀利了吧...

想了半天用 powershell 好像没有比较方便的办法,就写了这么一大段:[code]$start = 'aa';
$end = 'zz';

$result = @()

for($i=$start.length;$i--;){
        $tmp = @()
        $arr = [char[]]([char]$start[$i]..[char]$end[$i])
        foreach($r in $result){
                foreach($a in $arr){
                        $tmp+=[string]($r + $a);
                }
        }

        if($tmp.length){
                $result = $tmp
        } else {
                $result = $arr
        }
}

$result -join ' '[/code]不知道有没有更好的方案
不知道 powershell 以后会不会支持 $Array1 * $Array2、 $Array1 * 'String' 这样的数组组合语法

-----------------------------------------------------------

[char[]]([char]'a'..[char]'z') -join '' 的简单解释:[code]1、[char]'a'
[char]'a' 和 'a' 的区别在于前者是单个字符而后者是字符串
强制类型转换为字符类型可避免自动类型转换时调用用于字符串的方法
2、([char]'a'..[char]'z')
当出现运算符时,char 类型被强制转换成 int32 类型,得到该字符的 ansi 码,并参与运算
3、[char[]]
将所得数组理解为字符数组,最后得到的其实是 string 类型
4、-join ''
这就不用解释了吧
可有可无,只是模仿 perl 的输出格式...[/code]

Linuxer 发表于 2014-10-3 00:04

竖排,,,,[code][char[]](97..122)[/code]横排,,[code][char[]](97..122) -as [string][/code]

terse 发表于 2014-10-3 11:10

[code]$Array = [char[]](97..122)
$result = foreach($a in $Array){
    foreach($b in $Array){
        $a+$b
    }
}
$result -join ' '[/code]

CrLf 发表于 2014-10-3 20:38

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=155351&ptid=32305]2#[/url] [i]Linuxer[/i] [/b]


[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=155354&ptid=32305]3#[/url] [i]terse[/i] [/b]


    “你们已打(和了个谐)倒一周目第一关小头目”

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.