小编Mag*_*nus的帖子

在Bash函数中使用getopts

我想getopts在我的.bash_profile中定义的函数内部使用.我的想法是,我想将一些标志传递给此函数以改变其行为.

这是代码:

function t() {
    echo $*
    getopts "a:" OPTION
    echo $OPTION
    echo $OPTARG
}
Run Code Online (Sandbox Code Playgroud)

当我这样调用它时:

t -a bc
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

-a bc
?
 
Run Code Online (Sandbox Code Playgroud)

怎么了?我想在bc没有手动移位和解析的情况下获得该值.如何getopts在函数内正确使用?

编辑:纠正我的代码片段尝试$ OPTARG,无济于事

编辑#2:好的事实证明代码没问题,我的shell被搞砸了.打开一个新窗口解决了它.arg值确实在$ OPTARG中.

bash function getopts

43
推荐指数
3
解决办法
2万
查看次数

Scala RegexParsers中的非贪婪匹配

假设我在Scala中编写了一个基本的SQL解析器.我有以下内容:

class Arith extends RegexParsers {
    def selectstatement: Parser[Any] = selectclause ~ fromclause
    def selectclause: Parser[Any] = "(?i)SELECT".r ~ tokens
    def fromclause: Parser[Any] = "(?i)FROM".r ~ tokens
    def tokens: Parser[Any] = rep(token) //how to make this non-greedy?
    def token: Parser[Any] = "(\\s*)\\w+(\\s*)".r
}
Run Code Online (Sandbox Code Playgroud)

在尝试匹配SELECT foo FROM barselect 语句时,如何防止selectclause因为rep(token)in 而吞噬整个短语~ tokens

换句话说,如何在Scala中指定非贪婪匹配?

为了澄清,我完全知道我可以在String模式本身中使用标准的非贪婪语法(*?)或(+?),但我想知道是否有一种方法可以在def标记内的更高级别指定它.例如,如果我已经定义了这样的标记:

def token: Parser[Any] = stringliteral | numericliteral | columnname
Run Code Online (Sandbox Code Playgroud)

那么如何为def标记内的rep(标记)指定非贪婪匹配?

regex scala parser-generator non-greedy

14
推荐指数
1
解决办法
3277
查看次数

make git log --graph --all显示当前位置,如hg glog

如何让git在日志图中显示我当前的节点? git log --graph --all 使用*标记所有节点,但我习惯于Mercurial,其中hg glog通过用@描述它来直观地区分我当前的节点.这在git fetch(aka hg pull)之后特别有用,当我的当前节点不一定在顶部时.

目前我必须找出当前节点的哈希值,然后搜索图形日志的输出.有没有更好的办法?

PS - 我在非图形环境中,所以gitk不是一个选项.

[更新:现在我完全适应了git,我设置新环境的第一件事是发出以下命令来设置git别名:

git config --global alias.map 'log --graph --full-history --all --color --decorate'
Run Code Online (Sandbox Code Playgroud)

这允许我输入git map任何仓库并查看所有分支和提交的ascii-art地图,以及我在该地图上的位置.这个别名可能是我此时最常用的git命令(除了添加和提交),对我来说真的不可或缺]

git logging graph

13
推荐指数
1
解决办法
2316
查看次数

Perl one-liner:当使用-ne或-pe命令行开关时,如何引用传入的文件名

在Perl中,通常很容易获得对命令行参数的引用.我只是$ARGV[0]用来获取作为第一个参数传入的文件的名称.

然而,当使用Perl单线程时,它似乎不再起作用.例如,在这里我想打印我正在迭代的文件的名称,如果在其中找到某个字符串:

perl -ne 'print $ARGV[0] if(/needle/)' haystack.txt
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为ARGV在使用-n-p切换时不会填充.有没有解决的办法?

perl command-line

13
推荐指数
1
解决办法
6798
查看次数

Java/Scala以类型安全的方式获取Field引用

Java声称面向对象且类型安全,而Scala更是如此.

内部类字段由名为Field的类表示,您可以通过Reflection API获取对它的引用.

我的问题:这些语言是否提供了以类型安全的方式获取Field引用的任何方法?(如果不是,为什么不呢?看起来像一个明显的缺陷)

将Object映射到某个外部表示(例如,模板中的html字段或数据库中的列名称)时,这将非常有用,以使引用名称自动保持同步.

理想情况下,我想说的是:

&(SomeClass.someField).name() 
Run Code Online (Sandbox Code Playgroud)

获取字段声明的名称,类似于java enums允许的说法:

MyEnum.SOME_INSTANCE.name()
Run Code Online (Sandbox Code Playgroud)

[update:]在阅读反馈后,这个功能会以某种方式违反Reflection API的意图,我同意Reflection是针对编译时未知的事情而设计的,这就是为什么必须使用它来实现它是如此荒谬得知事情在编译时已知,非常类,即字段,它的编译!

编译器为枚举提供了这个,所以如果编译器能够访问枚举字段的引用以允许MyEnum.SOME_INSTANCE.name(),那么它没有逻辑上的原因它也不能为普通的类提供相同的功能. .

有没有技术上的原因为什么这个功能不适用于普通课程?我不明白为什么不这样做,我不同意这个功能会使事情"复杂化"......相反,它会极大地简化目前繁琐的Reflection API技术.为什么强迫开发人员使用Reflection来查找编译时已知的内容?

[更新#2]至于此功能的实用程序,您是否尝试过使用JPA或Hibernate中的Criteria API动态构建查询?你有没有看到人们想出的荒谬的解决办法,试图避免传递一个不安全的字符串表示字段来查询?

[更新#3]最后,一种名为Ceylon的新JVM语言已经注意到了这个调用并让这件事变得微不足道!

java reflection scala field-names type-safety

10
推荐指数
2
解决办法
2413
查看次数

在Vim中为什么"w"字选择器的行为在前面加"d"vs"v"时不一致

我想知道为什么在Vim中,当前面wdvs 时,密钥会影响不一致的文本量v.例如,假设我的光标在本文中的" t"之上two:

one two three
Run Code Online (Sandbox Code Playgroud)

现在dw产生:

one three
Run Code Online (Sandbox Code Playgroud)

vwd产生:

one hree
Run Code Online (Sandbox Code Playgroud)

是否有一些设置使这更加一致,或者我是否需要编写自己的自定义定义来修复它?

此外,资本W选择器同样不一致,我想知道是否有一个键可视地选择dW将被删除的相同部分?我能想出的最好的是vfspace哪个好,但是想知道是否有任何更短的东西,我错过了内置的东西.

vim

9
推荐指数
2
解决办法
253
查看次数

vim使用搜索内部变量的内容并替换表达式

在vimscript中我定义了一个这样的变量:

let b:myvar = 'abc'
Run Code Online (Sandbox Code Playgroud)

现在我如何将该var的内容插入到搜索和替换中,例如:

:s/123/&myvar/
Run Code Online (Sandbox Code Playgroud)

vim

8
推荐指数
2
解决办法
2858
查看次数

C++析构函数总是或者有时只调用数据成员析构函数吗?

我试图验证我对C++析构函数的理解.

我已多次读过C++提供默认的析构函数,如果我自己不编写它的话.但这是否意味着如果我写一个析构函数,编译器仍然不会提供堆栈分配的类字段的默认清理?

我的预感是,唯一理智的行为就是所有类字段都会被破坏,无论我是否提供自己的析构函数.在这种情况下,我读过这么多次的陈述实际上有点误导,可以更好地说明:

"无论你是否编写自己的析构函数,C++编译器总是编写一个类似于默认析构函数的序列来解除分类的成员变量.然后你可以通过定义自己的析构函数来指定其他的解除分配或其他任务"

它是否正确?

c++ destructor

8
推荐指数
1
解决办法
2236
查看次数

为什么golang“延迟”的范围是功能,而不是词法外壳

我惊讶地发现这两个程序产生了相同的输出:

程序A

package main
import "fmt"

func main() {  
    defer fmt.Println(1)
    defer fmt.Println(2)
}
Run Code Online (Sandbox Code Playgroud)

程序B

package main
import "fmt"

func main() {  
    {
        defer fmt.Println(1)
    }
    defer fmt.Println(2)
}
Run Code Online (Sandbox Code Playgroud)

换句话说,“defer”语句似乎无视词法闭包[编辑:感谢@twotwotwo 纠正我的术语,我的意思是说“块”而不是“词法闭包”] 并且严格限定于函数。我想知道:

  1. 我的理解正确吗?
  2. 有没有办法将它的范围限定到块,以便它在退出闭包时触发,而不是函数?

我可以想象按顺序执行多个工作单元,每个工作单元都需要在继续之前关闭自己的资源……最好不必仅出于此目的将它们分解为单独的功能。

go

8
推荐指数
2
解决办法
5029
查看次数

为什么git rebase的合并冲突通常比合并少?

我经常听说它说使用git rebase减少了合并冲突的数量而不是git merge,但是我从来没有找到解释为什么会这样的情况.

简单地在另一组更改之上重放一组更改并不会神奇地消除当两个人都修改相同代码行时的固有冲突,那么什么使rebase更好?

任何人都可以提供一个简单的例子,其中合并会有冲突,但rebase不会?

更新:在经历了3年的git经验之后,我开始相信我的原始前提是错误的:冲突在rebase与merge之间同样存在.然而,Rebase确实使历史更容易理解,并在需要时进行挑选或回放.

git merge rebase git-rebase

6
推荐指数
1
解决办法
500
查看次数