Perl One-liner 数据处理——基础语法篇【匠心】

Perl(Practical Extraction and Report Language)是一种功能强大且灵活的脚本语言,因其强大的文本处理能力和简洁的语法而广受开发者和系统管理员的喜爱。特别是在命令行环境下,Perl 的 one-liner(单行脚本)以其高效、简洁的特点,成为数据处理、文本转换和快速原型设计的利器。本文将详细介绍 Perl one-liner 在数据处理中的基础语法知识,涵盖常用选项、变量、数组、字符串操作、内置函数、条件语句、循环等内容,为后续深入应用打下坚实基础。

一、Perl One-liner 的基本概念

Perl one-liner 是指在命令行中通过单行代码执行的 Perl 脚本,通常结合管道(|)或文件输入输出,用于快速处理文本数据。它的核心优势在于无需编写完整的脚本文件,通过命令行参数和简洁的语法即可实现复杂的数据处理任务。Perl one-liner 的典型格式如下:

perl [选项] '脚本内容' [输入文件]

其中:

  • [选项]:如 -e-p-n-a 等,用于控制 Perl 的执行行为。
  • '脚本内容':单行 Perl 代码,定义具体的处理逻辑。
  • [输入文件]:可选,指定输入文件;若省略,Perl 从标准输入(STDIN)读取数据。

以下是一个简单的例子,用于在每行前添加行号:

echo -e "apple\nbanana\ncherry" | perl -pe '$_="$. $_"'

输出:

1 apple
2 banana
3 cherry

在这个例子中,-p 选项让 Perl 逐行处理输入,$. 表示行号,$_ 表示当前行内容,$_="$. $_" 将行号和行内容拼接后赋值给 $_,最终打印。

二、核心选项与工作机制

Perl one-liner 的强大离不开其丰富的命令行选项。以下是数据处理中最常用的选项及其工作机制。

1. -e:执行单行代码

-e 表示后面跟随的是 Perl 代码,而不是脚本文件。例如:

perl -e 'print "Hello, World!\n"'

输出:

Hello, World!

-e 是 Perl one-liner 的基础,允许直接在命令行中指定代码。

2. -p-n:逐行处理输入

-p-n 是 Perl one-liner 的核心选项,用于处理输入流(如标准输入或文件)。它们的工作机制是将用户代码包装在一个隐式的循环中:

while (<>) {# 用户代码
}
  • -n:逐行读取输入,执行用户代码,但不自动打印结果。例如:
echo -e "apple\nbanana" | perl -ne 'print if /a/'

输出:

apple
banana

这里,-n 让 Perl 逐行读取输入,print if /a/ 仅打印包含字母 a 的行。

  • -p:与 -n 类似,但会在每次循环结束时自动打印 $_(当前行内容)。例如:
echo -e "apple\nbanana" | perl -pe 's/a/A/'

输出:

Apple
bAnAnA

这里,-p 让 Perl 逐行读取并替换 aA,然后自动打印每一行。

区别-p 适合需要修改并输出每一行的场景,而 -n 适合需要筛选或手动控制输出的场景。

3. -a:自动分割

-a 选项与 -n-p 结合使用,自动将每行按空白字符(空格、Tab)分割为数组 @F。例如:

echo "a b c" | perl -ane 'print "$F[0]\n"'

输出:

a

这里,-a 将输入行 a b c 分割为数组 @F["a", "b", "c"]),print "$F[0]\n" 打印第一个元素 a

可以通过 -F 指定分隔符。例如,使用 : 作为分隔符:

echo "a:b:c" | perl -F: -ane 'print "$F[0]\n"'

输出:

a

4. -l:自动换行

-l 选项确保 print 语句自动添加换行符(\n),并在读取时自动去除每行的换行符(类似 chomp)。例如:

echo "apple" | perl -le 'print "fruit: $_"'

输出:

fruit: apple

若无 -l,需要手动添加 \n

echo "apple" | perl -e 'print "fruit: $_\n"'

5. 选项组合

选项可以组合使用,例如 -lane 表示同时启用 -l(自动换行)、-a(自动分割)、-n(逐行处理)、-e(执行代码)。以下是一个综合示例,打印每行第一个字段和字段数量:

echo "a b c" | perl -lane 'print "$F[0], fields: ", scalar @F'

输出:

a, fields: 3

三、变量与数据结构

Perl one-liner 中,变量和数据结构是数据处理的核心。以下是常用变量和数组的相关知识。

1. 变量命名规则

  • 标量变量:以 $ 开头,例如 $a$name。标量存储单一值(如数字、字符串)。访问数组元素时也使用 $,如 $a[0] 表示数组 @a 的第一个元素。
  • 数组:以 @ 开头,例如 @a@fields。数组存储有序的标量列表。
  • 哈希:以 % 开头,例如 %hash,用于存储键值对(本文暂不深入)。

注意:与 AWK 不同,Perl 不强制要求变量声明,变量在使用时自动创建。例如:

perl -e '$x = 42; print $x'

输出:

42

2. 内置变量

Perl 提供丰富的内置变量,简化数据处理。以下是常用的内置变量:

  • $_:默认变量,存储当前行内容(-p-n 模式下)。许多函数(如 prints///)默认操作 $_
  • $.:当前行号,从 1 开始计数。
  • @F:当使用 -a 选项时,存储当前行按分隔符分割后的字段数组。
  • @ARGV:存储命令行传入的文件参数。
  • $1, $2, …:正则表达式捕获组,用于提取匹配内容。

示例:打印行号和行内容:

echo -e "apple\nbanana" | perl -pe '$_="$.: $_"'

输出:

1: apple
2: banana

3. 数组操作

数组是 Perl one-liner 中处理多字段数据的关键。以下是常见操作:

  • 创建数组:通过 split-a 选项生成。例如:
echo "a b c" | perl -ne 'chomp; @a = split; print "$a[0]\n"'

输出:

a
  • 访问元素:使用 $a[索引],如 $a[0] 表示第一个元素,$a[-1] 表示最后一个元素。
  • 数组长度:使用 scalar @a 或在标量上下文中的 @a 获取数组元素个数。例如:
echo "a b c" | perl -ane 'print scalar @F, "\n"'

输出:

3

四、字符串操作

字符串处理是 Perl one-liner 的核心功能,涵盖字符串拼接、替换、分割等操作。

1. 单引号与双引号

  • 单引号 ' ':字符串按字面值处理,不解析变量或转义符(除 \'\\ 外)。例如:
perl -e 'print "Line: $.\n"'

输出:

Line: $.\n
  • 双引号 " ":支持变量插值和转义符(如 \n\t)。例如:
perl -e '$x = "World"; print "Hello, $x!\n"'

输出:

Hello, World!

2. 字符串拼接

Perl 使用点号(.)拼接字符串。例如:

perl -e '$a = "Hello"; $b = "World"; print $a . ", " . $b . "!\n"'

输出:

Hello, World!

3. 正则表达式与替换

Perl 的正则表达式(regex)功能是其核心优势之一。相比其他命令行工具如 grep(用于提取)、sed(用于替换)或 awk(用于字段处理),Perl 的正则表达式提供了更丰富的功能、更灵活的语法和更强大的捕获机制。

搜索:匹配模式

使用 =~ /pattern/ 操作符判断字符串是否匹配正则表达式,常与 -n-p 结合筛选行。例如:

echo -e "apple\nbanana" | perl -ne 'print if /pp/'

输出

apple

这里,/pp/ 匹配包含连续两个 p 的行,print 输出符合条件的行。运用修饰符(如 /i 忽略大小写)可增强灵活性。

提取:锚定位置

正则表达式的捕获组(用 () 定义)是提取数据的强大工具,捕获内容存储在 $1$2 等变量中。例如,提取夹在字母之间的数字:

echo "hello1996world" | perl -ne 'if (/[a-z]([0-9]+)[a-z]/) { print "$1\n" }'

输出

1996

命名捕获:Perl 支持命名捕获组 (?<name>pattern),通过 ${+{name}}$+{name} 访问,增强可读性。例如:

echo "hello1996world" | perl -ne '/(?<=[a-z])([0-9]+)(?=[a-z])/;print $1'

输出

1996

这里,(?<=[a-z])(正向后视)确保数字前是字母,([0-9]+) 捕获数字,(?=[a-z])(正向前视)确保数字后是字母,print $1 输出捕获的数字。

而用 grep 实现是这样的:

echo "hello1996world" | grep -P '(?<=[a-z])([0-9]+)(?=[a-z])' -o

grep 的对比

  • grep 也用于行匹配,其最大的优势是完成复杂的数据提取任务。
  • Perl 优势:支持更复杂的正则表达式(如命名捕获、零宽断言),并允许在匹配后直接处理(如提取子字符串)。
  • grep 局限:正则功能较简单(如不支持命名捕获),且难以直接修改内容,需要与 sed 结合使用。
替换:修改文本

使用 s/pattern/replacement/ 进行字符串替换,常与 -p 结合自动打印结果。例如:

echo "apple" | perl -pe 's/pp/PP/'

输出

aPPle

替换支持修饰符,如 /g(全局替换):

echo "apple app" | perl -pe 's/p/P/g'

输出

aPPle aPP

灵活分隔符s/// 的分隔符不限于斜杠,可以使用 #|、甚至 {} 等,避免转义问题。例如:

echo "/usr/bin" | perl -pe 's#/usr#/opt#'

输出

/opt/bin

条件替换:结合 ifunless 实现选择性替换。例如:

echo -e "apple\nbanana" | perl -pe 's/a/A/ if /pp/'

输出

Apple
banana

这里,仅当行包含 pp 时,将 a 替换为 A

sed 的对比

  • sed 也支持替换,例如 sed 's/pp/PP/' file 与 Perl 的 s/pp/PP/ 类似。
  • Perl 优势:支持复杂正则(如零宽断言、条件逻辑),允许动态替换(如通过 $1 引用捕获组),且语法更现代。
  • sed 局限:正则功能较弱(如不支持非贪婪匹配),替换逻辑较为简单,难以处理复杂条件。
复杂行列处理

一个经典的例子是提取重复行。

使用 AWK 实现:

echo 123445 | fold -w1 | awk '{count[$0]++} END {for (line in count) if (count[line] > 1) print line}'
echo 123445 | fold -w1 | awk 'a[$0]++'

注意后者的行为是:

  • 每一行 $0 存入数组 a
  • 如果某行是第一次出现,则 a[$0]++0,AWK 认为是 false,不打印
  • 从第二次开始 a[$0]++ 为 1、2…,被视为 true,就会输出这一行

使用 Perl 实现:

echo 123445 | fold -w1 | perl -ne '$count{$_}++ }{ print for grep { $count{$_} > 1 } keys %count'
echo 123445 | fold -w1 | perl -ne 'print if $a{$_}++'

awk 的对比

  • awk 擅长字段处理,例如 awk '{print $2}' 提取第二列,而 Perl 更适合复杂正则提取。
  • Perl 优势:正则表达式支持零宽断言、命名捕获等高级功能,提取逻辑更灵活;可直接处理非结构化文本。
  • awk 局限:正则功能较弱,主要依赖字段分割,难以处理复杂模式(如跨字段匹配)。
进阶正则特性
  • 非贪婪匹配:使用 .*? 替代 .* 进行非贪婪匹配。例如,提取第一个 <tag>
echo "<a>text<b>" | perl -ne 'if (/<(.*?)>/) { print "$1\n" }'

输出

a
  • 多行模式:修饰符 /m 使 ^$ 匹配每行开头和结尾,/s 使 . 匹配换行符。例如:
echo -e "line1\nline2" | perl -ne 'print if /^line1/m'

输出

line1
  • 正则调试:使用 use re "debug"(需在脚本中)或分解模式,验证复杂正则的正确性。
Perl 的独特优势

相比 grepsedawk,Perl one-liner 在正则处理上有以下优势:

  • 功能丰富:支持零宽断言、命名捕获、非贪婪匹配等高级特性,远超 grepsed
  • 编程灵活性:Perl 允许在正则后结合条件逻辑(如 if /pattern/)、循环和变量操作,而 awk 更适合结构化数据。
  • 一致性:Perl 的正则语法现代且统一,相比 sed 的传统正则(如需转义 {})更易用。
  • 跨场景适用:Perl 既能像 grep 筛选行,像 sed 替换文本,也能像 awk 处理字段,且支持复杂逻辑。

局限性

  • Perl one-liner 的学习曲线稍陡,语法灵活性可能导致新手出错。
  • 对于简单任务,grep(匹配)、sed(替换)或 awk(字段提取)可能更直观。
综合示例

提取日志中夹在 [ERROR]: 之间的时间戳,仅当行包含 fail

echo "[ERROR] 2025-05-13 23:45:01: fail detected" | perl -ne 'if (/fail/ && /\[ERROR\] (.*?):/) { print "$1\n" }'

输出

2025-05-13 23:45:01

对比其他工具

  • grepgrep 'fail' | grep -oP '\[ERROR\] \K.*?(?=:)'(需 Perl 正则扩展)。
  • sedsed -n '/fail/s/.*\[ERROR\] \(.*\):.*/\1/p'(复杂且不易读)。
  • awk:需先分割字段,难以处理非结构化模式。
  • Perl:逻辑清晰,结合 /fail/ 和捕获组,代码简洁且可扩展。

4. qqq 操作符

Perl 的字符串操作符 q()qq() 比单双引号更灵活,允许自定义分隔符(如 (){}||# 等),在处理包含引号的字符串时尤为有用。新手可能只熟悉单引号('')和双引号(""),但以下用法更具优势:

  • q():等价于单引号,不解析变量或转义符(除 \'\\)。例如:

    perl -e 'print q#Hello, "World"!#'  # 输出:Hello, "World"!
    
  • qq():等价于双引号,支持变量插值。例如:

    perl -e '$x = "Perl"; print qq|Welcome to $x!|'  # 输出:Welcome to Perl!
    

自定义分隔符避免转义问题,例如:

echo "data" | perl -pe '$_ = q{prefix:$_}'

输出:

prefix:data

新手需注意,qq() 支持变量插值,而 q() 不支持。选择分隔符时,优先使用与内容无冲突的字符(如 #|)。

五、函数与内置工具

Perl 提供丰富的内置函数,简化数据处理。以下是常用的函数及其用法。

1. chomp

chomp 去除字符串末尾的换行符(\n),常用于清理输入数据。例如:

echo "apple" | perl -ne 'chomp; print "fruit: $_"'

输出:

fruit: apple

若无 chomp,输出可能包含换行符,导致格式混乱。

2. split

split 将字符串按指定分隔符分割为数组。默认分隔符为空白字符。例如:

echo "a:b:c" | perl -ne 'chomp; @a = split /:/; print "$a[0]\n"'

输出:

a

3. length

length 返回字符串的长度。例如:

echo "apple" | perl -ne 'print length($_), "\n"'

输出:

6

注意:length(@F) 用于数组时,返回数组的第一个元素的长度,而不是数组长度。正确获取数组长度需使用 scalar @F

4. scalar

scalar 强制将表达式置于标量上下文,常用于获取数组长度。例如:

echo "a b c" | perl -ane 'print scalar @F, "\n"'

输出:

3

5. localtime

localtime 返回当前时间或指定时间戳的格式化字符串,常用于日志处理。例如:

perl -e 'print scalar localtime, "\n"'

输出:

Tue May 13 23:20:00 2025

六、控制结构

Perl one-liner 支持条件语句和循环,增强脚本的灵活性。

1. 条件语句

  • if:条件为真时执行。例如:
echo "apple" | perl -ne 'print if /a/'

输出:

apple
  • unless:条件为假时执行。例如:
echo "apple" | perl -ne 'print unless /b/'

输出:

apple

2. 循环

Perl one-liner 中,循环常用于处理范围或数组。

  • 范围操作符 ..:生成数字或字母序列。例如:
perl -e 'print join(",", 0..3), "\n"'

输出:

0,1,2,3

字母范围:

perl -e 'print join(",", "a".."c"), "\n"'

输出:

a,b,c
  • foreach 循环:遍历数组或范围。例如:
echo "a b c" | perl -ane 'foreach $x (@F) { print "$x\n" }'

输出:

a
b
c

七、语法风格:严格 vs 宽松

Perl 的语法风格灵活,支持严格和宽松两种模式。

  • 宽松模式:函数可以省略括号,控制结构(如 iffor)的 {} 在单语句时可省略。例如:
echo "apple" | perl -ne 'print if /a/'

等价于:

echo "apple" | perl -ne 'if (/a/) { print }'
  • 严格模式:通过 use strict; 强制变量声明,避免未定义变量导致的错误。one-liner 中通常不启用严格模式以保持简洁,但在复杂脚本中推荐使用。例如:
perl -e 'use strict; my $x = 42; print $x'

八、综合示例

以下是一个综合示例,展示 Perl one-liner 的多种功能。假设输入为:

name:age:city
Alice:25:New York
Bob:30:London

任务:提取每行的第一个字段(name),并在包含 o 的行前添加时间戳。

echo -e "name:age:city\nAlice:25:New York\nBob:30:London" | perl -F: -lpe '$_ = $F[0]; $_ = "[" . scalar localtime . "] $_" if /o/'

输出:

name
Alice
[Wed May 14 00:20:00 2025] Bob

解析:

  • -F::按 : 分割每行,存储到 @F
  • -l:自动换行。
  • -p:逐行处理并打印。
  • $_ = $F[0]:将第一个字段赋值给 $_
  • $_ = "[" . scalar localtime . "] $_" if /o/:若行包含 o,在行前添加时间戳。

九、注意事项与最佳实践

  1. 默认变量 $_:Perl one-liner 中,许多操作(如 prints///)默认作用于 $_,善用 $_ 可简化代码。
  2. 正则表达式优先:Perl 的正则表达式高效且灵活,优先使用正则处理文本。
  3. 测试与调试:one-liner 虽简洁,但复杂逻辑可能难以调试。建议先在脚本文件中测试,再转为 one-liner。
  4. 平衡极简与可读性:虽然简写风格能让 one-liner 更紧凑,但新手应在初期显式书写控制结构和变量,熟悉后再采用简写。
  5. 跨平台兼容性:Perl one-liner 在 Unix/Linux 和 Windows 上均可用,但注意换行符(\n vs \r\n)差异。建议使用 -l 选项自动处理换行符(读取时 chomp,打印时添加 \n)。

学习资源与社区
Perl one-liner 的学习曲线较陡,新手可通过以下资源加速掌握:

  • 官方文档perldoc perlrun 详细说明命令行选项,perldoc perlop 介绍操作符(如 q()s///)。
  • 社区资源:Perl Monks(perlmonks.org)提供大量 one-liner 示例和讨论。
  • 实践工具perl -MO=Deparse 展开简写代码,perl -d -e '代码' 进入调试模式,帮助理解复杂 one-liner。

十、总结

Perl one-liner 凭借其简洁的语法和强大的文本处理能力,成为数据处理领域的利器。本文详细介绍了 Perl one-liner 的基础语法,包括核心选项(-p-n-a-l)、变量与数组、字符串操作、内置函数、控制结构等内容。通过灵活运用这些语法,开发者可以在命令行中高效完成文本过滤、格式转换、数据提取等任务。后续可进一步探索 Perl one-liner 在日志分析、数据清洗、系统管理等场景中的应用,充分发挥其潜力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言defer关键字:延迟执行的精妙设计

深度解析Go语言defer关键字&#xff1a;延迟执行的精妙设计 引言 在Go语言中&#xff0c;defer语句是一种独特而强大的控制流机制&#xff0c;它通过​​延迟执行​​的方式解决资源管理、错误处理和异常恢复等关键问题。理解defer的工作原理是掌握Go并发编程和错误处理的关键…

C#项目07-二维数组的随机创建

实现需求 创建二维数组&#xff0c;数组的列和宽为随机&#xff0c;数组内的数也是随机 知识点 1、Random类 Public Random rd new Random(); int Num_Int rd.Next(1, 100);2、数组上下限。 //定义数组 int[] G_Array new int[1,2,3,4];//一维数组 int[,] G_Array_T …

.NET WinForm图像识别二维码/条形码并读取其中内容

需求:图像识别出一张图片中的二维码或者条形码&#xff0c;并读取其中内容。 一、安装库(特别注意&#xff0c;网上很多都没说清楚) 如果是基于.net framework&#xff0c;则安装ZXing.Net(建议0.14.0版本左右&#xff0c;具体看实际&#xff0c;版本太高&#xff0c;部分接口…

Guava限频器RateLimiter的使用示例

文章目录 1. 背景说明2. API与方法3. 示例代码3.1 基础工具方法3.2 测试任务类3.3 测试和统计方法3.4 测试两种模式的限频器3.5 测试缓冲时间与等待耗时 4. 完整的测试代码5. 简单小结 1. 背景说明 高并发应用场景有3大利器: 缓存、限流、熔断。 也有说4利器的: 缓存、限流、…

(面试)获取View宽高的几种方式

Android 中获取 View 宽高的几种方式&#xff0c;以及它们的适用场景和注意事项&#xff1a; 1. View.getWidth() 和 View.getHeight() 原理: 直接从 View 对象中获取已经计算好的宽度和高度。 优点: 简单直接。 缺点: 在 onCreate()、onStart() 等生命周期方法中&#xff0…

PostgreSQL pgrowlocks 扩展

PostgreSQL pgrowlocks 扩展 pgrowlocks 是 PostgreSQL 的一个系统扩展&#xff0c;用于显示表中行级锁定信息。这个扩展特别适合诊断锁争用问题和性能调优。 一、扩展安装与启用 1. 安装扩展 -- 使用超级用户安装 CREATE EXTENSION pgrowlocks;2. 验证安装 -- 查看扩展是…

JavaSE知识总结 ~个人笔记以及不断思考~持续更新

目录 字符串常量池 如果是创建对象还会吗&#xff1f; Integer也是在字串常量池中复用&#xff1f; 字符串拼接 为什么String是不可变的&#xff1f; String的不可变性是怎么做的&#xff1f; 外部代码不能创建对象&#xff1f; 构造方法不是私有的吗&#xff1f; 怎么…

使用HTTPS进行传输加密

文章目录 说明示例&#xff08;公网上的公开web&#xff09;安装SSL证书Certbot 的 Webroot 模式 和 Standalone 模式的区别**Webroot 模式****Standalone 模式** 技术对比表Node.js 场景下的最佳实践推荐方案&#xff1a;**Webroot 模式**Standalone 模式应急使用&#xff1a;…

驱动开发(2)|鲁班猫rk3568简单GPIO波形操控

上篇文章写了如何下载内核源码、编译源码的详细步骤&#xff0c;以及一个简单的官方demo编译&#xff0c;今天分享一下如何根据板子的引脚写自己控制GPIO进行高低电平反转。 想要控制GPIO之前要学会看自己的引脚分布图&#xff0c;我用的是鲁班猫RK3568&#xff0c;引脚分布图如…

ArcGIS Pro 3.4 二次开发 - 布局

环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 布局1 布局工程项1.1 引用布局工程项及其关联的布局1.2 在新视图中打开布局工程项1.3 激活已打开的布局视图1.4 引用活动布局视图1.5 将 pagx 导入工程1.6 移除布局工程项1.7 创建并打开一个新的基本布局1.8 使用修改后的CIM创建新…

OpenCV 图像像素的算术操作

一、知识点 1、operator (1)、MatExpr operator (const Mat & a, const Mat & b); a、a和b的行数、列数、通道数得相同。 b、a和b的每个像素的每个通道值分别相加。 (2)、MatExpr operator (const Mat & a, const Scalar & s); a、若a…

音视频中的复用器

&#x1f3ac; 什么是复用器&#xff08;Muxer&#xff09;&#xff1f; 复用器&#xff08;muxer&#xff09;是负责把音频、视频、字幕等多个媒体流打包&#xff08;封装&#xff09;成一个单一的文件格式的组件。 &#x1f4a1; 举个形象的例子&#xff1a; 假设你有两样东…

数据库安全性

一、计算机安全性概论 &#xff08;一&#xff09;核心概念 数据库安全性&#xff1a;保护数据库免受非法使用导致的数据泄露、更改或破坏&#xff0c;是衡量数据库系统的关键指标之一&#xff0c;与计算机系统安全性相互关联。计算机系统安全性&#xff1a;通过各类安全保护…

【Linux网络编程】网络层IP协议

目录 IP协议的协议头格式 网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 IP协议的协议头格式 4位版本号 &#xff1a;指定IP协议的版本&#xff0c;对于IPv4&#xff0c;版本号就是4。 4位首部长度&#xff1a;表名IP协议报头的长度&#xff0c;单…

“候选对话链”(Candidate Dialogue Chain)概念

目录 一、定义与形式 二、生成过程详解 1. 语言模型生成&#xff08;LLM-Based Generation&#xff09; 2. 知识图谱支持&#xff08;KG-Augmented Generation&#xff09; 3. 策略调控&#xff08;Policy-Driven Planning&#xff09; 三、候选对话链的属性 四、候选对…

Unity中的JsonManager

1.具体代码 先贴代码 using LitJson; using System.IO; using UnityEngine;/// <summary> /// 序列化和反序列化Json时 使用的是哪种方案 有两种 JsonUtility 不能直接序列化字典 ligJson可以序列化字典 /// </summary> public enum JsonType {JsonUtilit…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Split Landing Page(拆分展示页)

&#x1f4c5; 我们继续 50 个小项目挑战&#xff01;—— SplitLandingPage 组件 仓库地址&#xff1a;https://github.com/SunACong/50-vue-projects 项目预览地址&#xff1a;https://50-vue-projects.vercel.app/ 在这篇文章中&#xff0c;我们将实现一个交互式的左右面板…

机器学习-ROC曲线​​ 和 ​​AUC指标

1. 什么是ROC曲线&#xff1f;​​ ROC&#xff08;Receiver Operating Characteristic&#xff0c;受试者工作特征曲线&#xff09;是用来评估​​分类模型性能​​的一种方法&#xff0c;特别是针对​​二分类问题​​&#xff08;比如“患病”或“健康”&#xff09;。 ​…

Docker容器创建Redis主从集群

利用虚拟机中的三个Docker容器创建主从集群&#xff0c;容器信息&#xff1a; 容器名角色IP映射端口r1master192.168.150.1017001r2slave192.168.150.1017002r3slave192.168.150.1017003 启动多个redis实例 新建一个docker-compose文件来构建主从集群&#xff1a; 文件内容&…

手写ArrayList和LinkedList

项目仓库&#xff1a;https://gitee.com/bossDuy/hand-tear-collection-series 基于b站up生生大佬&#xff1a;https://www.bilibili.com/video/BV1Kp5tzGEc5/?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 LinkedList package com…