小编RHS*_*ger的帖子

Shell脚本读取最后一行丢失

我有一个... bash shell脚本的奇怪问题,我希望得到一些见解.

我的团队正在编写一个脚本,该脚本遍历文件中的行并检查每个行中的内容.我们有一个错误,当通过将不同脚本排序在一起的自动化过程运行时,最后一行没有被看到.

使用的代码遍历文件中的行(名称存储在DATAFILE

cat "$DATAFILE" | while read line 
Run Code Online (Sandbox Code Playgroud)

我们可以从命令行运行脚本,它会看到文件中的每一行,包括最后一行,就好了.但是,当由自动化进程(运行在相关脚本之前生成DATAFILE的脚本)运行时,永远不会看到最后一行.

我们更新了代码以使用以下代码迭代这些行,并清除了问题:

for line in `cat "$DATAFILE"` 
Run Code Online (Sandbox Code Playgroud)

注意:DATAFILE没有在文件末尾写入换行符.

我的问题是两部分......为什么最后一行不会被原始代码看到,为什么这会改变有所作为呢?

我只想到我能想出为什么最后一行不会被看到:

  • 前一个写入文件的进程依赖于进程结束以关闭文件描述符.
  • 问题脚本启动并在之前足够快地打开文件,而前一个进程已经"结束",它没有"关闭/清理"足以让系统自动关闭文件描述符.

话虽这么说,似乎,如果你在shell脚本中有2个命令,那么第一个应该在脚本运行第二个时完全关闭.

对问题的任何见解,尤其是第一个,都将非常感激.

bash process

58
推荐指数
3
解决办法
4万
查看次数

具有相关类型的通用键/值的通用映射

我正在尝试创建一个泛型类型,它保留了为以后使用而创建的自身版本的映射.实际上,它是一个单例模式,每种类型都有一个实例.我到目前为止的代码是:

public class FieldBinder<T> {
    static final Map<Class<? extends Object>,FieldBinder<? extends Object>> instanceMap = 
        new HashMap<Class<? extends Object>,FieldBinder<? extends Object>>();

    private FieldBinder() {}

    synchronized public static <V extends Object> FieldBinder<V> getInstance(Class<V> klass) {
        if(!instanceMap.containsKey(klass)) {
            instanceMap.put(klass, new FieldBinder<V>());
        }
        return (FieldBinder<V>)instanceMap.get(klass);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我仍然不确定我"做得对".感觉我应该能够指定集合是(Class - > FieldBinder).IDE警告返回语句的事实只会强化这种想法.

有没有更好的方法来处理这个?

注意:这个问题看起来非常密切相关,但是远远不够,我无法弄清楚如何将信息应用到我自己的问题中.

java generics collections

15
推荐指数
1
解决办法
2万
查看次数

非泛型类中的通用实例变量

我正在尝试编写一个具有泛型成员变量的类,但它本身并不是通用的.具体来说,我想说我有一个"可以实现与自身相似的某种类型"的值列表,因此我可以在该列表上调用sort ...我希望这是有道理的.

我正在尝试做的最终结果是创建一个类,以便我可以使用(任何给定类型)的数组创建所述类的实例,并让它为该列表生成字符串表示.在实际代码中,我还传入了我传入的类的类:

String s = new MyClass(Integer.class, 1,2,3).asString();
assertEquals("1 or 2 or 3", s);
String s = new MyClass(String.class, "c", "b", "a").asString();
assertEquals("\"a\" or \"b\" or \"c\"", s);
Run Code Online (Sandbox Code Playgroud)

最初我甚至不想传入类,我只想传递值并让代码检查结果数组以选择值的类......但这也给了我麻烦.

以下是我的代码,但是我无法想出适合变量类型的mojo.

public class MyClass {
    // This doesn't work as T isn't defined
    final List<T extends Comparable<? super T>> values;

    public <T extends Comparable<? super T>> MyClass (T... values) {
        this.values = new ArrayList<T>();
        for(T item : values) {
            this.values.add(item);
        }
    }

    public <T extends Comparable<? super T>> List<T> getSortedLst() …
Run Code Online (Sandbox Code Playgroud)

java generics

11
推荐指数
1
解决办法
2万
查看次数

Enchanced jsp:包含实现

一直困扰我的事情之一<jsp:include..>是,不可能将非String值作为页面的不同输入传递到包含的页面中.例如,我希望能够执行以下操作:

<c:forEach var="item" items="${listOfItems}">
    <jsp:include page="mypage.jsp">
        <jsp:attribute name="item" value="${item}/>
    </jsp:include>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

这个想法是,通过声明项目作为jsp:include节点内的属性传入,代码正在明确意图是什么......将该参数提供给包含的页面.

目前唯一可用的机制是定义属性"global",然后让包含的页面从全局空间中读取它.不幸的是,这失去了使用<jsp:param>提供的相同"意图".此外,它使代码更难调试,原因与任何编程环境中的全局变量相同.

有没有人知道执行jsp:include函数的include机制的实现,但是允许传入非String值?或者,如果没有,我会接受其他想法,保持意图和调试的简单目标.

作为旁注,我很乐意看到内置的"catch"机制,当包含的页面抛出错误时:

<abc:include page="mypage">
    <abc:param name="something" value="some string value"/>
    <abc:attribute name="somethingelse" value="${nonStringValue}"/>
    <abc:catch var="ex">
        The page failed, so the content it generated will not be sent to the output
        stream. Instead, we can collapse the part of the page that it's content
        would be... possibly putting a comment in the page with
        <!-- There was an exception generating this module: 
             <c:out value="${ex.getMessage}/>
          -->
    </abc:catch>
</abc:include>
Run Code Online (Sandbox Code Playgroud)

java jsp

5
推荐指数
1
解决办法
4262
查看次数

如何在函数式语言中使用闭包

出于某种原因,我倾向于将闭包与函数语言相关联.我相信这主要是因为我所看到的关于闭包的讨论几乎总是在一个专注于函数式编程的环境中.话虽这么说,我能想到的闭包的实际用途本质上都是非功能性的.

在函数式语言中是否存在闭包的实际用法,或者在我的脑海中是否存在关联,主要是因为闭包用于以函数式编程语言(一流函数,currying等)常见的样式编程?

编辑:我应该澄清一下,我指的是实际的函数式语言,这意味着我正在寻找保持参照透明度的用法(对于相同的输入,你得到相同的输出).

编辑:添加到目前为止发布内容的摘要:

  1. 闭包用于实现部分评估.具体来说,对于带有两个参数的函数,可以使用一个参数调用它,这会导致它返回一个带有一个参数的函数.通常,该第二函数"存储"传递给它的第一个值的方法是闭包.
  2. 可以使用闭包来实现对象.返回一个关闭了许多变量的函数,然后可以像对象属性一样使用它们.函数本身可以返回更多方法,这些方法充当对象方法,也可以访问这些变量.假设未修改变量,则保持参照透明度.

closures functional-programming

3
推荐指数
1
解决办法
618
查看次数