我希望用ARGV指定的每个(小)文件都在自己的数组中读取.如果我不测试$ARGV,<>将在单个表中啜饮所有文件.这样做有更好/更短/更简单的方法吗?
# invocation: ./prog.pl *.txt
@table = ();
$current = "";
while (<>)
{
if ($ARGV ne $current)
{
@ar = ();
$current = $ARGV;
if ($current)
{
push @table, \@ar;
}
}
push @ar;
}
Run Code Online (Sandbox Code Playgroud) 考虑这个简单的程序.你能解释为什么在取消注释前两行之后输出会有所不同吗?我的哈希发生了什么use strict?如何修复程序使用use strict?
echo -e "key1\nkey2\nkey3" | perl -lne '
#use strict; use warnings;
#my %hash;
BEGIN {
$hash{'key3'} = "value";
}
chomp;
if ($hash{$_}) {
print "$_ matched";
} else {
print "$_ unmatched ";
}
'
Run Code Online (Sandbox Code Playgroud)
输出:
key1 unmatched
key2 unmatched
key3 matched
Run Code Online (Sandbox Code Playgroud) OpenSSL Cookbook中的示例openssl root ca config 定义了以下内容(p40):
[req]
...
req_extensions = ca_ext
[ca_ext]
...
Run Code Online (Sandbox Code Playgroud)
稍后(p43),生成根ca密钥,然后生成root ca自签名证书.
openssl req -new \
-config root-ca.conf \
-out root-ca.csr \
-keyout private/root-ca.key
openssl ca -selfsign \
-config root-ca.conf \
-in root-ca.csr \
-out root-ca.crt \
-extensions ca_ext
Run Code Online (Sandbox Code Playgroud)
在这个特定的用例中,req_extensions不是多余的吗?什么时候真的需要req_extension?
我正在阅读一个有序的文件,我必须按小时,按分钟或按秒出现.如果需要,我必须打印出现0次(标准化输出)或跳过它们(非标准化输出).显然必须订购输出.
我首先想到使用数组.当输出未标准化时,我大致相当于:
@array[10] = 100;
@array[10000] = 10000;
Run Code Online (Sandbox Code Playgroud)
并打印结果:
foreach (@array) {
print if defined;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法将迭代减少到只有数组中定义的元素?在前面的示例中,这意味着只执行两次迭代,而不是使用$#array含义的10000次迭代.然后我还需要一种方法来了解循环中的当前数组索引.这样的事情存在吗?
我正在考虑越来越多地使用哈希.使用哈希解决了我的问题,也消除了将hh:mm:ss转换为索引的需要,反之亦然.
或者你有一个更好的解决方案来建议这个简单的问题?
考虑以下基本Perl modulino:
#!/usr/bin/perl -l
package Toto;
__PACKAGE__->run(@ARGV) unless caller();
sub run
{
print "@ARGV";
print "@_";
}
1;
Run Code Online (Sandbox Code Playgroud)
如果我在命令行上运行它,我得到:
$ ./Toto.pm 1 2 3
1 2 3
Toto 1 2 3
Run Code Online (Sandbox Code Playgroud)
如果我从测试中调用它:
$ perl -MToto -le 'Toto::run(1,2,3)'
#first line blank - no ARGV set
1 2 3
Run Code Online (Sandbox Code Playgroud)
换句话说,@_ inside run()的内容会根据函数的调用方式而改变.
你能解释一下发生了什么吗?