
例如,当前脚本根目录的文件夹 Action 中有 .py 文件:
那么运行的结果就是生成 "A","B","C","D"。
最近一直在用 PowerShell,发现这个需求在 PowerShell 中的实现惊人的简洁。
别的编程语言,还能用自带的库函数,写出比这更简洁又具有可读性的代码吗?
如果你觉得还可以,欢迎来挑战。
"$PSScriptRoot\Action" | dir -File -Filter '*.ps1'|% BaseName | Join-String -DoubleQuote -Separator ',' 感觉目前的答案中感觉 Ruby 的可读性最好
过滤器参数是不必要的,所以可以改为
("$PSScriptRoot\Action" | dir '*.ps1' -File).BaseName | Join-String -Separator ',' -DoubleQuote Join-String -Separator ',' -DoubleQuote 可以使用符号缩短,对于我而言那会降低可读性,所以并没这么上个追加写错了,路径参数传递了两遍,刚刚才发现,其实应该是
("$PSScriptRoot\Action\*.ps1" | dir -File).BaseName | Join-String -Separator ',' -DoubleQuote
1 FH0 May 5, 2021 |
2 aloxaf May 5, 2021 ```zsh echo \"${(j:",":)${(A)=:-$(print *.py(:r))}}\" ``` 简洁,并且具有可读性(确信 |
3 aloxaf May 5, 2021 ```zsh f=(*.py(:r));echo \"${(j:",":)f}\" ``` 比起强行塞到一个表达式里写成两段好像更好( |
4 msg7086 May 5, 2021 Ruby 的大概这样? Dir['Action/*.py'].map{|f| '"' + Pathname.new(f).basename.sub_ext('').to_s + '"'}.join(',') 如果能接受两边有 [] 的话,直接数组转字符串或者转换成 JSON 都行。 |
5 AndyAO OP @msg7086 #4 比起其他 Shell 语言来说,自以为可读性比那几个 Shell 语言强很多,像我这种完全不懂的人也能看明白大概是什么意思。 能做到这种简洁性和可读性真是太好了!这个比 PowerShell 强 最近翻看过几本松本行弘的书,感到这个人对于编程语言有着深刻的理解。 |
8 KomiSans May 5, 2021 ` let co = fs.readdirSync("../Action").filter(x=>x.indexOf(".py")>0).map(single=>single.replace(".py","")).toString(); ` Node.JS 好像有点复杂 |
9 ctro15547 May 5, 2021 import os print((lambda x:[i for i in x if i.find('.py') != -1])(os.listdir())) 有办法弄成一行吗。。。 |
10 AndyAO OP @aloxaf #7 按的也是 pwsh,你的写法的启发在于,直接在 path 用通配符,而不是用过滤器参数,问题貌似在于你遗漏了 -File 参数,这就导致如果文件夹名是.py 结尾可能会有错。 至于使用那种拼接操作,这个虽然更简洁,但是可读性并不好,我之前就是这么写的,后来换了 Join-String 。 你这个的意义在于,很好的展示了,只要愿意用符号 pwsh 比 zsh 和 bash 在长度方面也不差。 |
11 AndyAO OP |
13 AlisaDestiny May 5, 2021 python3 -c "import os;print([x.split('.')[0] for x in os.listdir('.') if x.endswith('.py')])" |
14 O5oz6z3 May 5, 2021 python3 另外四种写法…… 单引号+文件检测 ```python from pathlib import Path print(str([x.stem for x in Path('.').glob('*.py') if x.is_file()])[1:-1]) ``` 双引号 ``` python -c "from pathlib import Path; print(','.join([f'\"{x.stem}\"' for x in Path('.').glob('*.py')]))" python -c "from pathlib import Path; print(*[f'\"{x.stem}\"' for x in Path('.').glob('*.py')], sep=',')" python -c "from pathlib import Path; from json import dumps; print(dumps([x.stem for x in Path('.').glob('*.py')], ensure_ascii=False)[1:-1])" ``` |
15 learningman span class="ago" title="2021-05-05 13:29:46 +08:00">May 5, 2021 via Android @ctro15547 可以,__import__ |
16 no1xsyzy May 5, 2021 #!/usr/bin/env racket #lang rash (require rash/demo/setup) ls |>> string-split _ "\n" =filter= string-suffix? _ ".py" =map= string-append "\"" _ "\"" |> string-join _ "," |> display 除了每个 string 相关函数都带个 string- 前缀外挺简短的。 |
17 zbinlin May 5, 2021 bash shell 的这个还不简单吗? ls -mQ *.py 2>/dev/null |
18 TunkShif May 6, 2021 via Android |
19 AoEiuV020 May 6, 2021 shell, 本来以为很简单,没想到写出来还是用了 3 个管道,讲道理还是编程语言直接遍历更好, ls *.py|sed 's/\(.*\).py/"\1"/'|tr -t '\n' ','|sed 's/,$//' |