スクリプトを書いているときに、Perl の非常に奇妙な動作に気付きました。タスクは、変数に格納されている文字列の最後の文字をトリミングすることです。これは、またはより複雑な$temp1
を使用して実行できます。これらは両方ともワンライナーとして機能しますが、私のスクリプトでは解決策が機能しません。以下はデバッガーの例です。chop($temp1)
substr($temp1, 0, length($temp1) - 1)
substr
最初の問題:
最初の解決策 - 機能しない:
main::(delmid_n.pl:24): if (($state == 0) && ($_ !~ $musr) && ($_ !~ $lusr)) {
>> n
main::(delmid_n.pl:54): $strprn=substr($temp1, 0, length($temp1) - 1);
>> p $temp1
(-,user2,t-mobile.co.uk)\
>> p substr($temp1, 0, length($temp1) - 1) . "\n";
(-,user2,t-mobile.co.uk)
DB<4>
main::(delmid_n.pl:55): print $strprn . "\n";
DB<4>
main::(delmid_n.pl:56): $temp1 = "";
DB<4>
$strprn
変数でわかるように、何も格納されていません。同じコード ($strprn
変数に格納されている) が「p」コマンドを介して出力される場合、出力は問題ありません。この「バグ」は、前述のchop()
関数を使用して克服できます (以下のコードを参照)。
2番目の解決策 - 動作中:
main::(delmid_w.pl:24): if (($state == 0) && ($_ !~ $musr) && ($_ !~ $lusr)) {
>> p $temp1
(-,user2,t-mobile.co.uk)\
DB<4> n
main::(delmid_w.pl:56): chop ($temp1);
DB<4> n
main::(delmid_w.pl:57): print $temp1;
DB<4> n
(-,user2,t-mobile.co.uk)
main::(delmid_w.pl:58): $temp1 = "";
DB<4>
上記のコードは最初の例とまったく同じですが、次の 2 行は最初の例のものです。
$strprn=substr($temp1, 0, length($temp1) - 1);
print $strprn . "\n";
2 番目の例では、次の 2 行に置き換えられます。
chop ($temp1);
print $temp1;
2番目のソリューションの何が問題になっていますか?
2番目の問題:
これは、これまでのところ回避策がない問題です。
DB<1>
main::(delbeg_n.pl:15): $state = 0;
DB<1>
main::(delbeg_n.pl:16): $muser = qr/\(-,user1,[^,]+\.co\.uk\)\\$/;
DB<1>
main::(delbeg_n.pl:19): line: while (<>) {
DB<1>
main::(delbeg_n.pl:20): chomp; # strip record separator
DB<1>
main::(delbeg_n.pl:21): @Fld = split(/\s+/, $_,);
DB<1>
main::(delbeg_n.pl:23): if (($state == 0) && ($Fld[1] =~ $muser)) {
DB<1> p $Fld[1]
(-,user1,one2one.co.uk)\
DB<2> n
main::(delbeg_n.pl:43): print $_;
DB<2> p $_
netgroup1 (-,user1,one2one.co.uk)\
DB<3> if ($Fld[1] =~ $muser) {print "TRUE"}
TRUE
コードの 21 行目を実行するとわかるように、次の実行行は 43 行目 (else ステートメント) です。次の条件が true と評価されず、コードが 23、24、25 行目に続くのはなぜですか?
if (($state == 0) && ($Fld[1] =~ $muser))
次の行は、条件が true として評価される必要があることを示すために挿入されています。
if ($Fld[1] =~ $muser) {print "TRUE"}
どうもありがとう。