找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: zzz19760225

批处理勇士大闯关改中医许阳批处理的可能

[复制链接]
 楼主| 发表于 2026-3-8 10:43:07 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-3-8 11:01 编辑

一个游戏玩家信息主容器%a,对这个散列的聚散,清空,增减,修改等。
散列2键增减散列合并.pl

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %a = ();                # 清空散列a
  5. my %b = ();
  6. %a = (a1 => 1, a2 => 2);   # 重新赋值
  7. %b = (b3 => 3, b4 => 4);   # 定义散列b

  8. # 打印原始散列
  9. print "散列a:\n";
  10. foreach my $c (keys %a) {  print " $c => $a{$c} ,";}
  11. print "\n";
  12. print "散列b:\n";
  13. foreach my $c (keys %b) {  print " $c => $b{$c} ,";}
  14. print "\n";
  15. # 合并散列b到散列a(使用散列切片)
  16. @a{keys %b} = values %b; # 这里的@a不是指数组,是指散列切片,容易混淆!keys键名复数,values值复数

  17. # 遍历并打印合并后的散列a
  18. print "\n合并后的结果,合并散列a:\n";
  19. foreach my $c (keys %a) {  print "$c => $a{$c} ,";}

  20. <>;  # 等待用户输入,相当于暂停
复制代码
输出

  1. 散列a:
  2. a1 => 1 , a2 => 2 ,
  3. 散列b:
  4. b3 => 3 , b4 => 4 ,

  5. 合并后的结果,合并散列a:
  6. b3 => 3 ,b4 => 4 ,a1 => 1 ,a2 => 2 ,

复制代码
 楼主| 发表于 2026-3-8 17:11:41 | 显示全部楼层
本帖最后由 zzz19760225 于 2026-3-8 17:24 编辑

输入实现散列合并处理
散列2键增减散列合并输入.pl

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. a0:
  5. my %a = (a1 => 1, a2 => 2);
  6. my %b = (b3 => 3, b4 => 4);

  7. # 打印原始散列
  8. print "散列a:\n";
  9. foreach my $c (keys %a) {  print " $c => $a{$c} ,";}
  10. print "\n";
  11. print "散列b:\n";
  12. foreach my $c (keys %b) {  print " $c => $b{$c} ,";}
  13. print "\n";

  14. print "请输入: ";
  15. my $input = <STDIN>;
  16. chomp $input;

  17. if ($input eq '123') {
  18.     @a{keys %b} = values %b;
  19.     print "执行合并。\n";
  20.     goto a1;  # 跳转到显示标签
  21. }
  22. # 如果输入错误,也执行到这里
  23. a1:
  24.     print "a1标签下的散列a:";
  25.     foreach my $c (keys %a) {  
  26.                   print "$c => $a{$c} ,";
  27.     }
  28. print "\n";

  29. <>;
  30. goto a0;
复制代码
输出

  1. 散列a:
  2. a2 => 2 , a1 => 1 ,
  3. 散列b:
  4. b4 => 4 , b3 => 3 ,
  5. 请输入: 789
  6. a1标签下的散列a:a2 => 2 ,a1 => 1 ,

  7. 散列a:
  8. a2 => 2 , a1 => 1 ,
  9. 散列b:
  10. b4 => 4 , b3 => 3 ,
  11. 请输入: 123
  12. 执行合并。
  13. a1标签下的散列a:a2 => 2 ,b4 => 4 ,a1 => 1 ,b3 => 3 ,

  14. 散列a:
  15. a1 => 1 , a2 => 2 ,
  16. 散列b:
  17. b3 => 3 , b4 => 4 ,
  18. 请输入: 456
  19. a1标签下的散列a:a1 => 1 ,a2 => 2 ,

  20. 散列a:
  21. a1 => 1 , a2 => 2 ,
  22. 散列b:
  23. b3 => 3 , b4 => 4 ,
  24. 请输入: 123
  25. 执行合并。
  26. a1标签下的散列a:b3 => 3 ,a1 => 1 ,a2 => 2 ,b4 => 4 ,

复制代码
 楼主| 发表于 5 天前 | 显示全部楼层
建立#注释储存取
散列键注释学生管理表1.pl

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. binmode STDOUT, ":utf8";
  6. binmode STDIN, ":utf8";

  7. # 文件名
  8. my $filename = $0;  # 当前脚本文件名

  9. # 读取文件中的注释数据
  10. my @nicknames = read_nicknames_from_file($filename);

  11. # 第一次使用,没有昵称
  12. if (scalar(@nicknames) == 0) {
  13.     print "首次使用,请输入您的昵称(直接回车将使用'无名勇士'):";
  14.     my $input = <STDIN>;
  15.     chomp $input;
  16.    
  17.     my $nickname = $input ne "" ? $input : "无名勇士";
  18.    
  19.     # 将昵称保存到文件
  20.     add_nickname_to_file($filename, $nickname);
  21.    
  22.     print "昵称已设置为:$nickname\n";
  23.     @nicknames = ($nickname);  # 更新内存中的昵称列表
  24. }

  25. # 显示管理表
  26. while (1) {
  27.     print "\n" . "=" x 40 . "\n";
  28.     print "          昵称管理表\n";
  29.     print "=" x 40 . "\n";
  30.    
  31.     # 显示所有昵称
  32.     if (scalar(@nicknames) > 0) {
  33.         foreach my $i (0 .. $#nicknames) {
  34.             printf "%d. %s\n", $i + 1, $nicknames[$i];
  35.         }
  36.     } else {
  37.         print "暂无昵称\n";
  38.     }
  39.    
  40.     print "-" x 40 . "\n";
  41.     print "操作选项:\n";
  42.     print "a. 新增昵称\n";
  43.     print "d. 删除昵称(输入序号)\n";
  44.     print "q. 退出\n";
  45.     print "请选择操作(a/d/q):";
  46.    
  47.     my $choice = <STDIN>;
  48.     chomp $choice;
  49.    
  50.     if ($choice eq 'a') {
  51.         # 新增昵称
  52.         print "请输入新昵称(直接回车将使用'无名勇士'):";
  53.         my $new_nickname = <STDIN>;
  54.         chomp $new_nickname;
  55.         $new_nickname = "无名勇士" if $new_nickname eq "";
  56.         
  57.         add_nickname_to_file($filename, $new_nickname);
  58.         print "已添加昵称:$new_nickname\n";
  59.         
  60.         # 重新读取昵称列表
  61.         @nicknames = read_nicknames_from_file($filename);
  62.     }
  63.     elsif ($choice eq 'd') {
  64.         # 删除昵称
  65.         if (scalar(@nicknames) == 0) {
  66.             print "没有可删除的昵称!\n";
  67.             next;
  68.         }
  69.         
  70.         print "请输入要删除的序号(1-" . scalar(@nicknames) . "):";
  71.         my $num = <STDIN>;
  72.         chomp $num;
  73.         
  74.         if ($num =~ /^\d+$/ && $num >= 1 && $num <= scalar(@nicknames)) {
  75.             my $deleted_nickname = $nicknames[$num - 1];
  76.             # 从数组中删除
  77.             splice(@nicknames, $num - 1, 1);
  78.             # 保存到文件
  79.             save_nicknames_to_file($filename, @nicknames);
  80.             print "已删除昵称:$deleted_nickname\n";
  81.             
  82.             # 删除后继续循环,不会退出程序
  83.             # 重新读取文件以确保数据一致
  84.             @nicknames = read_nicknames_from_file($filename);
  85.         } else {
  86.             print "无效的序号!\n";
  87.         }
  88.     }
  89.     elsif ($choice eq 'q') {
  90.         print "退出程序。\n";
  91.         last;  # 退出while循环
  92.     }
  93.     else {
  94.         print "无效的选择,请重新输入!\n";
  95.     }
  96. }

  97. # 等待用户输入后退出
  98. print "\n按回车键退出...";
  99. <>;

  100. # ==================== 子函数 ====================

  101. # 从文件中读取所有昵称
  102. sub read_nicknames_from_file {
  103.     my ($file) = @_;
  104.     my @nicknames;
  105.    
  106.     open my $fh, '<:utf8', $file or die "无法打开文件 $file: $!";
  107.     while (my $line = <$fh>) {
  108.         # 查找注释行: #0 或 #1 等开头的行,后跟 nickname: 值
  109.         if ($line =~ /^#\d+\s+.*nickname:\s*(\S[^\n]*)/) {
  110.             push @nicknames, $1;
  111.         }
  112.     }
  113.     close $fh;
  114.    
  115.     return @nicknames;
  116. }

  117. # 添加新昵称到文件
  118. sub add_nickname_to_file {
  119.     my ($file, $new_nickname) = @_;
  120.    
  121.     # 先读取现有内容
  122.     open my $fh, '<:utf8', $file or die "无法打开文件 $file: $!";
  123.     my @lines = <$fh>;
  124.     close $fh;
  125.    
  126.     # 查找最后一个注释行的编号
  127.     my $last_num = -1;
  128.     foreach my $line (@lines) {
  129.         if ($line =~ /^#(\d+)\s+/) {
  130.             $last_num = $1 if $1 > $last_num;
  131.         }
  132.     }
  133.    
  134.     # 生成新注释行
  135.     my $new_num = $last_num + 1;
  136.     my $new_line = "#$new_num nickname: $new_nickname\n";
  137.    
  138.     # 在文件末尾添加新行
  139.     push @lines, $new_line;
  140.    
  141.     # 写回文件
  142.     open $fh, '>:utf8', $file or die "无法写入文件 $file: $!";
  143.     print $fh @lines;
  144.     close $fh;
  145. }

  146. # 保存所有昵称到文件(替换原有)
  147. sub save_nicknames_to_file {
  148.     my ($file, @nicknames) = @_;
  149.    
  150.     # 读取现有内容
  151.     open my $fh, '<:utf8', $file or die "无法打开文件 $file: $!";
  152.     my @lines = <$fh>;
  153.     close $fh;
  154.    
  155.     # 过滤掉所有 nickname 注释行
  156.     my @new_lines;
  157.     foreach my $line (@lines) {
  158.         # 如果不是 nickname 注释行,保留
  159.         if ($line !~ /^#\d+\s+.*nickname:/) {
  160.             push @new_lines, $line;
  161.         }
  162.     }
  163.    
  164.     # 添加新的 nickname 注释行
  165.     foreach my $i (0 .. $#nicknames) {
  166.         push @new_lines, "#$i nickname: $nicknames[$i]\n";
  167.     }
  168.    
  169.     # 写回文件
  170.     open $fh, '>:utf8', $file or die "无法写入文件 $file: $!";
  171.     print $fh @new_lines;
  172.     close $fh;
  173. }
复制代码
输出

  1. 首次使用,请输入您的昵称(直接回车将使用'无名勇士'):
  2. 昵称已设置为:无名勇士

  3. ========================================
  4.           昵称管理表
  5. ========================================
  6. 1. 无名勇士
  7. ----------------------------------------
  8. 操作选项:
  9. a. 新增昵称
  10. d. 删除昵称(输入序号)
  11. q. 退出
  12. 请选择操作(a/d/q):a
  13. 请输入新昵称(直接回车将使用'无名勇士'):123
  14. 已添加昵称:123

  15. ========================================
  16.           昵称管理表
  17. ========================================
  18. 1. 无名勇士
  19. 2. 123
  20. ----------------------------------------
  21. 操作选项:
  22. a. 新增昵称
  23. d. 删除昵称(输入序号)
  24. q. 退出
  25. 请选择操作(a/d/q):a
  26. 请输入新昵称(直接回车将使用'无名勇士'):123
  27. 已添加昵称:123

  28. ========================================
  29.           昵称管理表
  30. ========================================
  31. 1. 无名勇士
  32. 2. 123
  33. 3. 123
  34. ----------------------------------------
  35. 操作选项:
  36. a. 新增昵称
  37. d. 删除昵称(输入序号)
  38. q. 退出
  39. 请选择操作(a/d/q):d
  40. 请输入要删除的序号(1-3):2
  41. 已删除昵称:123

  42. ========================================
  43.           昵称管理表
  44. ========================================
  45. 1. 无名勇士
  46. 2. 123
  47. ----------------------------------------
  48. 操作选项:
  49. a. 新增昵称
  50. d. 删除昵称(输入序号)
  51. q. 退出
  52. 请选择操作(a/d/q):

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 19:28 , Processed in 0.015960 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表