编写传统的Unix/Linux程序时,perl提供了菱形运算符<>.我试图理解如何测试是否没有传递任何参数以避免perl脚本在STDIN的等待循环中不应该.
#!/usr/bin/perl
# Reading @ARGV when pipe or redirect on the command line
use warnings;
use strict;
while ( defined (my $line = <ARGV>)) {
print "$ARGV: $. $line" if ($line =~ /eof/) ; # an example
close(ARGV) if eof;
}
sub usage {
print << "END_USAGE" ;
Usage:
$0 file
$0 < file
cat file | $0
END_USAGE
exit();
}
Run Code Online (Sandbox Code Playgroud)
一些输出运行显示<>工作,但没有参数我们等待STDIN输入,这不是我想要的.
$ cat grab.pl | ./grab.pl
-: 7 print "$ARGV: $. $line" if ($line =~ /eof/) ; # an …
Run Code Online (Sandbox Code Playgroud) 我java 6我可以声明arraylist如下
方式1:使用泛型,也就是<Integer>
在右手边
List<Integer> p = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
Way2:使用钻石操作员
List<Integer> p = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
Way3:仅在左侧使用通用
List<Integer> p = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用方式3作为简要介绍.这些方式之间有什么区别吗?我们应该选择哪一个?为什么?
更新: -我知道在java 7推荐第二种方式,但我的问题是在java 6的上下文中.哪一个更好?
对我来说,方式3也说p是整数的arraylist(同样通过way1传达).所以我发现除了IDE显示警告信息之外没有区别:
ArrayList是原始类型.
ArrayList<E>
应参数化对泛型类型的引用
我知道自Java 7以来,在实例化过程中在构造函数中重复泛型类的类型是一种冗余.但是钻石操作员<>怎么样,重复它呢?换句话说,我想知道这有什么区别:
List<String> Fruits = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
还有这个
List<String> Fruits = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
或这个
Map<Integer, String> students = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)
还有这个
Map<Integer, String> students = new HashMap();
Run Code Online (Sandbox Code Playgroud)
先感谢您
有人可以建议如何重写下面的代码,使其可以与JDK 1.6一起使用吗?
private Map<SocketChannel, byte[]> dataTracking = new HashMap<>();
Run Code Online (Sandbox Code Playgroud) 如何直接将菱形运算符中的值传递给函数(sub)?
我试过了:
#!/usr/bin/perl
use Math::Complex;
#quadraticEq - quadratic equation with parameters a ,b ,c
sub quadraticEq {
print "\nx1= ",
($_[1]*$_[1]-sqrt($_[1]*$_[1]-4*$_[0]*$_[2]))/(2*$_[0]),
"\nx2= ",
($_[1]*$_[1]+sqrt($_[1]*$_[1]-4*$_[0]*$_[2]))/(2*$_[0]);
}
print 'Enter Numbers:';
quadraticEq(<>,<>,<>); #here
Run Code Online (Sandbox Code Playgroud)
但是当我为每个函数参数输入数字时,我需要输入EOF.它表现得像@array=<>
.我希望它表现得像$var=<>
.所以输入应该如下所示:
Enter Numbers: 5 4 3
Run Code Online (Sandbox Code Playgroud) 我有这行代码:
List<IObserver<?>> observers = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
并得到以下 3 个错误:
Cannot instantiate the type ArrayList<?>
Syntax error on token "<", ? expected after this token
Type mismatch: cannot convert from ArrayList<?> to List<IObserver<?>>
Run Code Online (Sandbox Code Playgroud)
我使用的是 Eclipse 3.7,我安装了 JDK 7 update 5,并且项目设置为在构建路径中使用 JRE 系统库 [JavaSE1.7]。
传入IObserver<?>
右侧的编译很好,但我必须使用菱形运算符。
我认为这是一个配置问题,但我无法弄清楚我错过了什么。
我想知道在Java 7 钻石操作符与先前版本的Java的语言构造方面是否存在任何已知的性能差异.
基本上,使用它更快:
List<String> myList = new ArrayList<>()
Map<String, Integer> myMap = new HashMap<>()
Run Code Online (Sandbox Code Playgroud)
或者使用这个:
List<String> myList = new ArrayList<String>()
Map<String, Integer> myMap = new HashMap<String, Integer>()
Run Code Online (Sandbox Code Playgroud)
它们的速度是否相同?
我正在使用java 7,这个代码片段无法编译
ImmutableSortedMap<Integer, String> INT_TO_WORD =
new ImmutableSortedMap.Builder<>(Ordering.natural())
.put(1, "one")
.put(2, "two")
.put(3, "three")
.build();
Run Code Online (Sandbox Code Playgroud)
而这一个确实如此
ImmutableSortedMap<Integer, String> INT_TO_WORD =
new ImmutableSortedMap.Builder<Integer, String>(Ordering.natural())
.put(1, "one")
.put(2, "two")
.put(3, "three")
.build();
Run Code Online (Sandbox Code Playgroud)
为什么我需要在rhs
何时指定类型lhs
?是否有更多的东西给<>
操作员而不是眼睛.
考虑以下代码(代码中有两个问题):
import java.util.*;
public class Tree<T> {
private T info;
private List<Tree<? extends T>> children = new ArrayList<Tree<? extends T>>();
public Tree<? extends T> getChildren(int n) {
return children.get(n);
}
public void addChildren(Tree<? extends T> children) {
this.children.add(children);
}
public static void main(String[] args) {
Tree<?> b2; // so b2 is a reference of a Tree of unknown type
b2 = new Tree<Number>(); /* to allow b2 to call addChildren() with Tree<? extends Number> aguments */
b2.addChildren(new Tree<Number>()); // 1) …
Run Code Online (Sandbox Code Playgroud) 是否有更快的方法在Java中实例化对象,而不必重新键入类?例如,看看这个实例化的大部头:
HashMap<Integer, ArrayList<ActivityRecord>> days = new HashMap<Integer, ArrayList<ActivityRecord>>();
Run Code Online (Sandbox Code Playgroud)
我喜欢这样的简写:
HashMap<Integer, ArrayList<ActivityRecord>> days = new();
Run Code Online (Sandbox Code Playgroud)
或者,我也很高兴Eclipse快捷方式自动完成实例化以使用无参数构造函数.
即使这个问题听起来很烦人,但我仍然坚持这一点.所描述的问题发生在Ubuntu 14.04
和CentOS 6.3
.
我正在使用一个perl脚本netbps
,在答案中发布了一个名为RedGrittyBrick
:by https://superuser.com/questions/356907/how-to-get-real-time-network-statistics-in-linux-with-kb- MB-字节格式和-为
上面的脚本基本上接受了tcpdump的输出(这里有一个我们不需要知道的命令)并以不同的格式表示它.请注意,脚本在流模式下执行此操作(即,输出是在运行中生成的).
因此,我的命令如下所示:
tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl
shell /控制台上生成的输出如下所示:
13:52:09 47.86 Bps
13:52:20 517.54 Bps
13:52:30 222.59 Bps
13:52:41 4111.77 Bps
Run Code Online (Sandbox Code Playgroud)
我试图将此输出捕获到文件,但是,我无法这样做.我尝试过以下方法:
tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333" 2>&1 | ./netbps.prl > out.out 2>&1
这会创建一个空out.out
文件.shell /控制台上没有输出.
tcpdump -i eth0 -l -e -n "src portrange …
从官方Java JDK1.7指南,我得到了这个引用,但我不明白它是如何工作的.谁能解释一下?换句话说,钻石在传递空字符串时如何推断出Integer类型?
Run Code Online (Sandbox Code Playgroud)MyClass<Integer> myObject = new MyClass<>("");
在此示例中,编译器为通用类MyClass的形式类型参数X推断类型Integer.它推断出此泛型类的构造函数的形式类型参数T的类型String.