-1

スクリプトを書いているときに、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"}

どうもありがとう。

4

1 に答える 1

1

両方の問題が関連しています。線の最後に何か変なものがあります。

まず、行末のスラッシュの後に切り捨てられていない改行文字があるように見えます-少なくともデバッガーはそれを示しています:

>> p $temp1
                (-,user2,t-mobile.co.uk)\

  DB<4> n

改行がなければ

>> p $temp1
                (-,user2,t-mobile.co.uk)\
  DB<4> n

したがって、次の 2 つの文字が必要です:\と改行。

奇妙な動作の理由 -- 入力ファイルを見ないとわかりません。

また、文字列の長さを使用する代わりにsubstr( $string, 0, -1 )、最後の文字を除くすべてを返すこともできます。

それがおそらくあなたの2番目の問題の理由です-一致すると思いますが、不一致の原因は\(-,user1,[^,]+\.co\.uk\)\\行末マーカーです。$

  • use strictお願いします
  • ファイルの種類を確認してください (dos、unix、古い mac)
  • 16 進エディタでファイルを表示する
于 2012-10-10T00:24:10.203 に答える