perl基础:perl中@_, 和 1,$2,...及其类似变量的含义

本文详细介绍了Perl编程语言中特殊变量@_和$_的作用及用法。@_作为默认的数组变量和子函数参数列表,在传递参数给子函数时非常有用。$_作为默认列表变量和模式匹配空间,在正则表达式匹配等场景中被频繁使用。

由于直接复制的原因,建议阅读原文:http://blog.sciencenet.cn/blog-634847-497909.html.

-------------------------------------------

1.@_含义

1)是perl中默认的数组变量

比如说你想移除数组中的一个元素赋值给一个变   value=shift @abcd;

方法2:你没有定义任何数组
       my $value=shift @_;   和上例等效
       这里perl会隐式的选择@_

2)是sub子函数中的默认参数列表.

例如:
sub funct($$) {
    ($param1, $param2) = @_;
    #Statement
}

再例如,有下面一段代码:
my max_number = &max(1,2);
print "1 and 2 ,the max number is
max_number\n";
sub max{
     my (   num2) = @_[0,1]; ## 取出参数列表中的元素。
     ........此处省略求max运算
}

在子函数中直接shift; 就可以从@_的前端弹出一个元素.

shift;
等于
shift @_;

-------------------------

@_ is the list of incoming parameters to a sub. So if you write a sub, you refer to the first parameter in it as $_[0], the second parameter as $_[1] and so on. And you can refer to $#_ as the index number of the last parameter:
sub demo {
  print "Called with ",#_+1," params\n";
  print "First param was
_[0]\n";

Note that the English module adds in the ability to refer to the special variables by other longer, but easier to remember, names such as @ARG for @_ and   $. But use English; can have a detrimental performance effect if you're matching regular expressions against long incoming strings

2.$_含义

 

1)     _;
2)默认模式匹配空间(pattern matching space)
s/.../.../;
等于
$_ =~ s/.../.../;

---------------------------

Then any regular expression matches, chops (and lcs and many more) without a parameter, and even prints assume you want to work on     line = <FH>) {
  if (   line;
  }

Shortens to:
while (<FH>) {
  /Perl/ and
    print FHO ;
  print uc;
  }
3.   2,...等含义

以数字为名的变量保存的是上一次匹配操作(/pattern/)中,第n个小括号中的原符号所匹配内容。  
  2就是第二对小括号中的原符号所对应的匹配内容。

内插功能:  

  str   =~ /(\d)z{3}(\d)/;  
print   "   2\n";  

输出结果是:4     7  

http://blog.sciencenet.cn/blog-634847-497909.html
<think>我们正在分析Perl代码中的正则表达式替换操作:`$pure_line =~ s/;.*//` 这个替换操作的含义是:删除字符串 `$pure_line` 中从第一个分号 `;` 开始到该行末尾的所有内容。 具体分解: - `s/pattern/replacement/` 是Perl中的替换运算符,表示用`replacement`替换字符串中匹配`pattern`的部分。 - 这里的模式(pattern)是 `;.*` - `;` 匹配一个分号(字面字符)。 - `.*` 匹配任意字符(除换行符外)0次或多次,直到行尾(因为Perl中默认情况下`.`不匹配换行符,所以这里会匹配到行尾,但不会跨行)。 - 替换部分为空字符串(即`//`),表示将匹配到的内容替换为空(即删除)。 因此,这个操作的效果是:删除字符串中从第一个分号开始直到行尾的所有内容(包括分号本身)。这通常用于删除行内注释(如果注释以分号开头)。 示例: 假设 `$pure_line` 的值为 `"hello ; world"`,执行替换后,字符串变为 `"hello "`(注意后面有一个空格)。 注意: - 如果一行中有多个分号,则从第一个分号开始删除。例如:`"a;b;c"` 会变成 `"a"`。 - 如果没有分号,则不会进行任何替换。 这种操作在解析配置文件时很常见,用于去除行尾注释。 参考引用[1]中提到的替换变量$1, $2等)在这个表达式中没有使用,因为模式中没有使用捕获括号。 如果需要保留分号之前的内容,但又不确定是否有分号,这个操作是安全的,因为如果没有分号,就不会替换。 另外,如果希望匹配包括换行符在内的任意字符(即跨行),可以在模式后面加上`s`修饰符(如`s/;.*//s`),但在这个例子中没有使用,所以不会跨行。 因此,这个正则表达式替换的含义是:删除当前行中从第一个分号开始到行尾的所有内容。 如果用户的需求是去除行尾注释(以分号开头),那么这个操作是合适的。 生成相关问题: 1.Perl中,如何删除字符串中从某个字符开始到行尾的内容? 2. Perl正则表达式替换操作中,如何使用捕获组来保留部分内容? 3. 如何修改上述正则表达式以匹配跨行的内容? 4.Perl中,如何处理以分号开头的行(整个行都是注释)?</think>### Perl 正则表达式 `$pure_line =~ s/;.*//` 详解 #### 1. **表达式结构分解** ```perl $pure_line =~ s/;.*// ``` - `$pure_line`:待处理的字符串变量 - `=~`:绑定操作符,表示对变量应用正则表达式 - `s/pattern/replacement/`:替换操作语法 - `;.*`:匹配模式 - 空替换部分 `//`:表示删除匹配内容 #### 2. **匹配模式解析** | 组件 | 含义 | 示例 | |------|------|------| | `;` | 匹配**分号字符** | `"a;b"` → 匹配 `;` | | `.*` | 匹配**任意字符0次或多次**(直到行尾) | `";comment"` → 匹配整个字符串 | **组合效果**: 匹配从**第一个分号开始到行尾的所有内容**,例如: - `"hello; world"` → 匹配 `; world` - `"no;comment;here"` → 匹配 `;comment;here` #### 3. **操作效果** - **删除所有分号及后续内容** ```perl my $pure_line = "data; comment"; $pure_line =~ s/;.*//; # 结果: "data" ``` - **保留无分号的行** ```perl my $pure_line = "important data"; $pure_line =~ s/;.*//; # 结果不变: "important data" ``` - **处理多个分号** ```perl my $pure_line = "a;b;c"; $pure_line =~ s/;.*//; # 结果: "a" (删除第一个分号后的全部内容) ``` #### 4. **典型应用场景** 常用于**删除行内注释**(当注释以分号开头时): ```perl # 配置文件处理示例 while (<CONFIG>) { my $pure_line = $_; $pure_line =~ s/;.*//; # 删除注释 $pure_line =~ s/^\s+|\s+$//g; # 修剪空格 next if $pure_line eq ""; # 跳过空行 # 处理有效配置行... } ``` 输入行 `"port=8080 ; web server port"` → 输出 `"port=8080"` #### 5. **注意事项** 1. **分号位置敏感** - 仅删除**第一个分号**之后的内容 - 若需删除**所有分号**,需用 `s/;//g` 2. **跨行匹配** 默认不匹配换行符(`.*` 不包含 `\n`),若需跨行删除需添加 `/s` 修饰符: ```perl $pure_line =~ s/;.*//s; # 匹配包括换行符的内容 ``` 3. **保留分号场景** 若需保留分号但删除注释,需用捕获组: ```perl # 保留分号前的所有内容(包括分号) $pure_line =~ s/(;.*)//; # 删除内容存入$1,但结果未改变 $pure_line =~ s/;.*//; # 更简单的写法 ``` #### 6. **与引用[1]的关系** 此操作虽未显式使用 `$1`,但符合Perl替换操作的基本原理[^1]: ```perl # 等效显式捕获版本 $pure_line =~ s/(;.*)//; # 匹配内容存入$1,但未在替换中使用 ``` --- ### 测试案例 ```perl use Test::Simple tests => 3; sub test_comment_removal { my ($input, $expected) = @_; my $result = $input; $result =~ s/;.*//; return $result eq $expected; } ok( test_comment_removal("value", "value"), "无注释保留原值"); ok( test_comment_removal("a;b", "a"), "删除分号后内容"); ok( test_comment_removal(";full comment", ""), "纯注释行清空"); ``` 输出: ``` 1..3 ok 1 - 无注释保留原值 ok 2 - 删除分号后内容 ok 3 - 纯注释行清空 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值