我想split()在換行符和空格字符上添加一個字串:
#!/usr/bin/perl
use warnings;
use strict;
my $str = "aa bb cc\ndd ee ff";
my @arr = split(/\s\n/, $str); # Split on ' ' and '\n'
print join("\n", @arr); # Print array, one element per line
輸出是這樣的:
aa bb cc
dd ee ff
但是,我想要的是:
aa
bb
cc
dd
ee
ff
所以我的代碼在換行符上拆分(好)而不是空格。 根據 perldoc,空格應該\s在字符類中匹配,我會假設那 是空格。我錯過了什么嗎?
uj5u.com熱心網友回復:
您正在拆分一個空白字符,后跟一個換行符。要在遇到任何一個時拆分,有
split /[\s\n]/, $str
但是\s包括\n,所以這可以簡化。
split /\s/, $str
但是,如果連續有兩個空格怎么辦?當遇到一系列空白時,您可以拆分。
split /\s /, $str
您可以提供一個特殊的輸入,它可以做同樣的事情,只是它會忽略前導空格。
split ' ', $str
所以,
use v5.14;
use warnings;
my $str = "aa bb cc\ndd ee ff";
my @arr = split ' ', $str;
say for @arr;
uj5u.com熱心網友回復:
我的代碼在換行符上拆分(好)
您的代碼沒有在換行符上拆分;由于您列印東西的方式,它似乎只是這樣。您的陣列包含一個元素,而不是兩個。該元素中間有一個換行符,您只是在列印aa bb cc\ndd ee ff.
\s\n表示:任何空格后跟換行符,其中空格實際上包括\n.
改變:
my @arr = split(/\s\n/, $str);
至:
my @arr = split(/\s/, $str);
使用Data::Dumper清楚地表明陣列現在有 6 個元素:
use warnings;
use strict;
use Data::Dumper;
my $str = "aa bb cc\ndd ee ff";
my @arr = split(/\s/, $str);
print Dumper(\@arr);
印刷:
$VAR1 = [
'aa',
'bb',
'cc',
'dd',
'ee',
'ff'
];
上面的代碼適用于您提供的輸入字串。使用以下方法拆分多個連續的空格也很常見:
my @arr = split(/\s /, $str);
uj5u.com熱心網友回復:
您的問題來自對代碼結果的錯誤分析。當您實際上根本沒有拆分任何東西而實際上只是在列印換行符時,您認為您已經在換行符上拆分了。
如果你想在未來避免這個錯誤,并且確切地知道你的變數包含什么,你可以使用核心模塊Data::Dumper:
use strict;
use warnings;
use Data::Dumper;
my $str = "aa bb cc\ndd ee ff";
my @arr = split(/\s\n/, $str); # split on whitespace followed by newline
$Data::Dumper::Useqq = 1; # show exactly what is printed
print Dumper \@arr; # using Data::Dumper
輸出:
$VAR1 = [
"aa bb cc\ndd ee ff"
];
正如您很容易看出的那樣,您根本沒有列印陣列,只是列印一個標量值(在陣列內部,因為您將它放在那里)。Data::Dumper是除錯資料的絕佳工具,也是您學習的寶貴工具。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/537914.html
標籤:perl分裂空格删除空白
上一篇:編輯檔案中的最后一個實體
下一篇:v5.10中的Perl$AUTOLOAD評估顯示“在操作員預期的位置找到了Bareword”...但是v5.26作業正常
