perl - 检测单行中的第一个或第二个文件

标签 perl

在 AWK 中,对于在两个文件上运行的脚本,这种结构很常见:

awk 'NR==FNR { print "first file"; next } { print "second file" }' file1 file2

它使用了定义了两个变量的事实:FNR,它是当前文件中的行号和 NR,它是全局计数(相当于 Perl 的$.).

Perl 中有类似的东西吗?我想我也许可以使用 eof 和一个计数器变量:

perl -nE 'if (! $fn) { say "first file" } else { say "second file" } ++$fn if eof' file1 file2

这行得通,但感觉我可能遗漏了什么。


为了提供一些上下文,我写了 this answer我在其中手动定义了一个散列,但相反,我想从第一个文件中的值填充散列,然后对第二个文件进行替换。我怀疑在 Perl 中有一种简洁、惯用的方法可以做到这一点。

最佳答案

不幸的是,perl 没有类似的NR==FNR 结构来区分两个文件。您可以做的是使用 BEGIN block 处理一个文件,使用主体处理另一个文件。

例如,要处理具有以下内容的文件:

map .txt

a=apple
b=ball
c=cat
d=dog

alpha.txt

f
a
b
d

你可以这样做:

perl -lne'
BEGIN { 
    $x = pop; 
    %h = map { chomp; ($k,$v) = split /=/; $k => $v } <>; 
    @ARGV = $x 
}
print join ":", $_, $h{$_} //= "Not Found"
' map.txt alpha.txt
f:Not Found
a:apple
b:ball
d:dog

更新:

我给出了一个非常简单的例子,现在当我看到它时,我只能说 TIMTOWDI 因为你可以这样做:

perl -F'=' -lane'
    if (@F == 2) { $h{$F[0]} = $F[1]; next }
    print join ":", $_, $h{$_} //= "Not Found"
' map.txt alpha.txt
f:Not Found
a:apple
b:ball
d:dog

但是,我可以肯定地说,perl 没有NR==FNR 结构,您可以根据文件以各种不同的方式处理它们。

关于perl - 检测单行中的第一个或第二个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25349157/

相关文章:

multithreading - 使用线程和 Perl TK 隐藏段错误 Perl 5.8.8

perl - Cwd.c : loadable library and perl binaries are mismatched (got handshake key 0xdb00080, 需要 0xde00080)

perl - 在perl中将数字视为数字的最简单方法?

perl - 如何为 PSGI/Plack 网络应用程序(在 Perl 中)提供静态文件(图像等)?

perl - Perl 中的参数传递样式

Perl - eval 不捕获 "use"语句

perl - 从函数返回散列的最佳 Perl 实践是什么?

perl - 当 Starman 收到 HUP 时,ZMQ 套接字会阻塞

perl 按位与和按位移位

perl - 安装MEAD时出错,没有此类文件或目录: 'prank.o'