我不是一個沉重的 perl 用戶。我只是在學習。但是,最近我正在使用其他人撰寫的舊腳本。從本質上講,腳本讀取一個輸入檔案,其中定義了變數“index_a”,以便在進行簡單列印時:
print "$index_a";
00
我的困惑來自以下幾點:
當與“零”進行比較時,它成立:
if ($index_a == 0) { print "Found first index: 0" };
Found first index: 0
我原以為比較是假的。因為 index_a = 00 的值是從輸入檔案中讀取一行獲得的。因此,據我了解 index_a 是一個值為“00”的字串,因此不應執行 if 陳述句。
一些 perl 專家可以幫助我理解這一點嗎?另外,您能否讓我知道在 perl 中檢查資料型別的正確方法是什么?我有使用 python 和 C 的經驗,因此這種行為對我來說非常混亂。
謝謝!
uj5u.com熱心網友回復:
在 Perl 中,考慮值時背景關系很重要。標量變數可以包含各種資料型別,但是您要測驗的內容決定了您找到的內容。例如:
if ("00" == 0) # string "00" is numerically identical to 0
if ("a" == 0) # string "a" is numerically identical to 0 (gives a warning)
# Argument "a" isn't numeric in numeric eq (==)
if ("00" eq "0") # string "00" is not stringwise identical to "0".
if (@a == 0) # if the array @a is empty (length 0)
在對字串進行數字相等性檢查時,Perl 會嘗試將字串轉換為數字。如果字串以數字開頭,它將被強制轉換為該數字(在測驗期間),否則它將被強制轉換為0.
當您測驗變數包含的內容時,您必須(某種程度上)知道變數中包含的內容。否則你必須更徹底地檢查。在您的情況下,從檔案中讀取時,您可能希望使用eq來測驗字串是否相等。
uj5u.com熱心網友回復:
當您在數字背景關系中使用 Perl 字串時,例如數字比較,它會識別看起來像十進制數的起始部分并忽略之后的內容。它識別的任何東西都會成為數字。
它遵循以下基本規則:
- 忽略前導空格。當您從列資料中提取一個欄位并且該數字不占用整列時,這很方便。
- 允許單個前導符號 (
或-) - 跳過前導零(所以,沒有八進制)
- 捕獲十進制 ASCII 數字(0、1、2、3、4、5、6、7、8、9),允許單個小數點(因此,沒有語意版本號)
- 在第一個非十進制數字字符處停止
- 到目前為止,您擁有的都是數字。如果你什么都沒有,數字就是0。
不過有幾點需要注意:
- 將 0 添加到字串是強制數字模式的常用方法。
- 字串中的下劃線只是下劃線。您可以使用下劃線分隔數字文字中的數字,但不能使用字串分隔。所以,
123_456是123456因為 perl 決議器處理_, 但'123_456'只是123. - 但是,如果第一個字符(不包括符號)是“Inf”,在任何情況下,字串都會轉換為“Inf”并包含
-符號但不包含符號。這就是 Infinity 的特殊 IEEE 值。 - 但是,如果第一個字符(不包括符號)是“NaN”,在任何情況下,字串都會轉換為“Nan”并排除任一符號。這是特殊的“非數字”值。
這里有些例子:
#!perl
use v5.10;
use utf8;
use open qw(:std :utf8);
my @strings = qw(
-5 7 006 -01 00
.1234 -.9876 .657 ..890 1.2.3
???
- -657
12a34 a987 123fred 0456barney
0x12 12_34 0177
NaN -NaN NAN
Inf Inf -Inf INF Infamy Infinity
);
push @strings, " 432", " 123", " -987", " 063"," NaN", " Inf", '';
foreach my $string ( @strings ) {
printf "%-12s => %s\n", qq('$string'), 0 $string;
}
和輸出:
'-5' => -5
' 7' => 7
' 006' => 6
'-01' => -1
'00' => 0
' .1234' => 0.1234
'-.9876' => -0.9876
'.657' => 0.657
'..890' => 0
'1.2.3' => 1.2
'???' => 0
'-' => 0
' ' => 0
' -657' => 0
'12a34' => 12
'a987' => 0
'123fred' => 123
'0456barney' => 456
'0x12' => 0
'12_34' => 12
'0177' => 177
'NaN' => NaN
'-NaN' => NaN
'NAN' => NaN
'Inf' => Inf
' Inf' => Inf
'-Inf' => -Inf
'INF' => Inf
'Infamy' => Inf
'Infinity' => Inf
' 432' => 432
' 123' => 0
' -987' => -987
' 063' => 63
' NaN' => NaN
' Inf' => Inf
'' => 0
最后,還有一個關于 Perl 標量的有趣的事情。當您將字串用作數字時,Perl 會將字串轉換為數字并記住該轉換。但是,它不會更改字串。Devel::Peek向您展示 Perl 資料結構的內部結構。
#!perl
use v5.10;
use Devel::Peek;
select(STDERR); $| ; # just to order the output from Dump
my $string = '123fred';
say "string is <$string>";
Dump( $string );
say '-' x 40;
my $n = $string 0;
say "string is <$string>";
Dump( $string );
這是輸出。首先,$string有一個PV(指標值)的字串。在數字運算之后,它還有數字的IV和NV值。
string is <123fred>
SV = PV(0x7f8be980cab0) at 0x7f8bea0160f8
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK)
PV = 0x7f8be9610ca0 "123fred"\0
CUR = 7
LEN = 10
COW_REFCNT = 1
----------------------------------------
string is <123fred>
SV = PVNV(0x7f8be980ac50) at 0x7f8bea0160f8
REFCNT = 1
FLAGS = (POK,IsCOW,pIOK,pNOK,pPOK)
IV = 123
NV = 123
PV = 0x7f8be9610ca0 "123fred"\0
CUR = 7
LEN = 10
COW_REFCNT = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/399098.html
標籤:perl
