📜  Perl 中的特殊变量

📅  最后修改于: 2022-05-13 01:55:24.778000             🧑  作者: Mango

Perl 中的特殊变量

Perl 中的特殊变量是那些已经定义为在需要时执行特定函数的变量。 Perl 中的特殊变量与随机字符的区别在于变量后使用标点符号,可以是@$%等,例如$_

Perl 变量可以帮助开发人员节省时间,因为这些通常是英文大命令的快捷方式。

查看以下代码以了解此特殊变量:

# Providing some input 
while ( <> ) 
{ 
    # Printing the default value 
    # stored in $_
    print lc($_); 
}

这与

#!/usr/bin/perl
while ( $abc = <> ) 
{
    print lc($abc);
}

以下是上述特殊变量的工作格式示例:

#!/usr/bin/perl
foreach ('Mango', 'Orange', 'Apple')
{
   print($_);
   print("\n");
}
输出:
上述代码的输出将是:
Mango
Orange
Apple

特殊变量的类型

特殊变量可以根据它们的用途和性质进行分类。这些都是:

  1. 正则表达式特殊变量
  2. 文件句柄特殊变量
  3. 全局标量特殊变量
  4. 全局数组特殊变量
  5. 全局散列特殊变量
  6. 全局特殊常量
  7. 全局特殊文件句柄

正则表达式特殊变量

$digit:$digit $digit主要函数是将匹配到的文本保存在最后匹配的模式中的一组相似的括号中。但是,嵌套块中已经匹配的模式不计算在内。

$&, $MATCH:用于查找上次成功模式搜索中匹配的字符串。虽然在隐藏块中匹配或包含在当前集合中不计算在内。这是一个只读变量,并且是动态范围的。

#!/usr/bin/perl
  
# Declaring local string
local $_ = 'abcdefghi';
  
# Pattern matching
/def/;
  
# Printing the matched pattern
print "$&\n";  
输出:
def

$`, $PREMATCH:带引号的字符串前面的字符串与上一次成功的模式匹配匹配。它不计算包含在块中的任何匹配项或当前块包含的 eval。

#!/usr/bin/perl
  
# Declaring local string
local $_ = 'abcdefghi';
  
# Pattern matching
/def/;
  
# Prematching the pattern
print "$`:$&\n";  
输出:
abc:def

$', $POSTMATCH:最后一次成功的模式匹配所匹配的任何内容后面的字符串,不包括隐藏在当前块中的块或 eval 中的任何匹配。

#!/usr/bin/perl
  
# Declaring local string
local $_ = 'abcdefghi';
  
# Pattern matching
/def/;
  
# Postmatching the pattern
print "$&:$'\n";  
输出:
def:ghi

文件句柄特殊变量

$|, $OUTPUT_AUTOFLUSH如果设置为非零,则此变量在当前选择的输出通道上的每个写入或打印语句之后强制刷新。

$%, $FORMAT_PAGE_NUMBER此变量查找当前选择的输出通道和当前页码。

$=, $FORMAT_LINES_PER_PAGE此变量返回当前页面长度,即当前所选输出通道的可打印行。此变量的默认值为 60。

$-, $FORMAT_LINES_LEFT返回当前所选输出通道的页面上剩余的行数。

$~, $FORMAT_NAME当前选定输出通道的当前报告格式的名称。默认值为文件句柄的名称。例如,对于STDOUT ,默认格式名称将是STDOUT本身。

全局标量特殊变量

下面提到的是一些标量特殊变量的列表。并列出了相应的英文名称以及符号名称。
$_, $ARG :当变量被省略时,用作接受输入和执行模式搜索的默认变量。

$., $NR :包含上次更新的文件句柄的行号。如果文件句柄关闭,则该值重置为零。此变量永远不会移动文件中的查找指针。

$/, $RS :这是输入记录分隔符。如果 $/ 未定义,则将整个文件作为空值的单个输入读取,空白被视为分隔符。它默认创建一个新行。

#!/usr/bin/perl
  
local $/;           # enable "slurp" mode
local $_ = ;    # whole file now here
s/\n[ \t]+/ /g;

'$, ', $ OFS:当用户想要在每个打印运算符参数之间打印默认值时,使用输出字段分隔符命令。此变量的默认值为undef

$\, $ORS:当用户想要打印最后一个打印运算符参数的值时,使用输出记录分隔符命令。

$!、$OS_ERROR 或 $ERRNO :产生错误编号的当前值。如果在数字上下文中使用,则为变量。
如果在字符串上下文中使用,它会产生相应的系统错误字符串。

if (open my $fh, "<", $filename) 
{
    # Here $! is meaningless.
    ...
}
else 
{
    # ONLY here is $! meaningful.
    ...
    # Already here $! might be meaningless.
}
  
# Since here we might have either success or failure,
# $! is meaningless.

在这里,据说它没有意义,因为这里这个变量( $! )与open()运算符的结果无关。

全局数组特殊变量

@ARGV :在命令行参数中,@ARGV 是用于预期脚本的数组。它通常比参数总数少一个值。

$ perl -e 'print join( ", ", @ARGV), "\n"' a b c
a, b, c
$ perl -e 'print join( ", ", @ARGV), "\n"' a "b c" d
a, b c, d

Here, a, b, c, d represents any numeric values.

@INC:这个变量可以被认为是内置的帮助数组,其中包含查找要由 do、require 或 use 构造评估的脚本的位置列表。

BEGIN { unshift @INC, "local/lib" };

    use lib "local/lib";

@F :当我们使用 -a 命令行开关时,我们使用 @F 来拆分行并将其输入到数组中。这个数组需要一个完整的包名,因为它是特定于包的。

全局散列特殊变量

%INC :此变量包含已包含的每个文件的文件名条目。这些条目是通过dorequireuse运算符完成的。

%ENV :包含您当前环境的哈希值。

#!/usr/bin/perl
my $doo = 1;
$ENV{'car'} = \$doo;
  
if( ref $ENV{'car'} ) 
{
    print "Ver 5.18.0";
} 
else
{
    print "Ver 5.18.0";
}
输出:
Ver 5.18.0

%SIG :要更新各种信号的值,使用此哈希。它包含信号的信号处理程序。

全局特殊文件句柄

ARGV: ARGV 是一个特殊的文件句柄,当使用@ARGV 时,文件名在命令行上迭代。通常,它是空文件句柄。

STDERR:它是任何包中标准错误的特殊文件句柄。

STDIN:任何包中标准输入的特殊文件句柄。

STDOUT:任何包中标准输出的特殊文件句柄。

DATA:特殊文件句柄,它引用包含脚本的文件中 __END__ 标记之后的任何内容。

_(下划线):用于缓存来自最后一个 stat、lstat 或文件测试运算符的信息的特殊文件句柄。

全局特殊常量

__END__:用于显示程序的结束。

__FILE__:显示引用的文件名。

__LINE__:显示当前行号

__PACKAGE__:此变量显示包名称。