• 締切済み

perlのバージョンによる動作の違い

perl5.6.0と5.6.1で挙動が違って困っちゃってます。 $a = "abc[test]de[test]fgh[test]ij"; @b = ($a =~ /(.*?)\[test\]/sg); print join("|", @b); exit; LINUXでperl5.6.0だと abc|de|fgh LINUXでperl5.6.1だと abc どっちがバグでしょうか? #取り敢えずプログラム自体はsplitで代用して動かしました

  • Perl
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

正規表現の/s修飾子を除くと5.6.1でも abc|de|fgh と出力しますね。 プログラミングPerl第3版によると、/sスイッチは、単一の行が入っている という仮定で、改行文字にもマッチし、$*変数を無視するとのことですね。 $*変数が何者かを知りませんが、このあたりが怪しいところでしょうか?

関連するQ&A

  • join と split で文字列を操作する場合

    にんにちは、 うまく解決する方法を思いつかないので、質問させてください。 以下のスクリプトを実行すると、a から z を * で join して、 その後、* で split するかなと思ったら、split は正規表現として とらえるためでしょうか、エラーになります。 #! /usr/bin/perl -w use strict; my $a = '*'; my $b = join $a , ('a'..'z'); print "$b\n"; my @result = split /$a/,$b; print "$_\n" foreach @result; exit(); $a = '\*'; にすると、split したときに、 余計な \ が残ってしまいます。 任意の(書く時点では分からない)いろんな文字列で 連結したり分割したりする場合のスマートな方法が ありましたら、教えていただけませんか? Perl 5.8 です。お願いします。

    • ベストアンサー
    • Perl
  • Linux上でtcpdumpの出力をperlで処理したいと考えています

    Linux上でtcpdumpの出力をperlで処理したいと考えています。 下記のようにtcpdumpの標準出力をperlの標準入力で受け取ろうとしても tcpdumpの処理が終わらないためパイプ(|)経由でperlにデータが渡ってきません。 [test.pl] $|=1; foreach(<>){ print "--- $_"; } exit; Linux上のコマンド tcpdump -l | ./test.pl これをteeに置き換えるとtcpdumpの出力はリアルタイムに表示されます。 tcpdump -l | tee a.log 質問:perlでteeを作ることはできますか?

    • ベストアンサー
    • Perl
  • PerlでCGIを書いておりますが、特定のURL(ディレクトリ)の位置データを取得するには?

    PerlでCGIを書いております。 http://test.com/a/test/index.cgiにアクセスしているときに、perlがaを取得して、http://test.com/b/test/index.cgiにアクセスしているときbを取得する良い方法は有るのでしょうか?WindowsとLinuxの両方で動作できれるものがあれば宜しくお願いします。 WindowsとLinuxではディレクトリの感じが違うようなので1個の方法で実現できれば助かります。

    • 締切済み
    • CGI
  • Perlで複数の値を返す良い方法はありますか?

    以下のように多重代入できるかと思って確かめましたが、 結果は以下の通りでした。 $a=[] $b=[20] 方法はいろいろとありそうですが、Perl苦手でわかりません。 sub test{ local $cc = ''; local $s = ''; $cc = 'AAAAA'; $s = 20; # return $cc, $s; } $a, $b = &test; print "\$a=[$a]\n"; print "\$b=[$b]\n"; exit; __END__

    • ベストアンサー
    • Perl
  • 行頭と行末に文字追加

    文字変換がうまくいきません。 sedとawkもしくはperlを使ってなんとかならないでしょうか? 行の行頭と行末を " で囲みたいのですが。 ------test.txt----- abc cde fgh hijk lm nopq rstu vwx y z ------test.txt---- 以下のように。 "abc cde fgh" "hijk lm" "nopq rstu vwx y z" よろしくお願いします。

    • ベストアンサー
    • Perl
  • PerlからPythonについて

    以下のPerlをPythonで書くとどうなるのでしょうか? pythonのヒアドキュメントと<DATA>, chompの動作の置き換えが知りたいです。 ヒアドキュメントは"""や'''で可能?と思いますが、ヒアドキュメントを1行づつ取り出す方法がわかりません。 use strict; # <-- Pythonの厳格化?の警告方法も知りたいです。 while(<DATA>){ chomp; print "$_\n"; } exit; __DATA__ abc de f ghi 参考になるサイトや本をご存じの方教えてください。

    • ベストアンサー
    • Perl
  • 皆さんは、LinuxでPerlのバージョンアップはどのようにしていますか?

    VineLinux 2.6?で Perl5.6.1を使っております。 最初 VineLinux2.5でしたがアップデートして2.6?になっております。 最近、Perl5.8系を使う必要がでてきた為、Perl5.6から Perl5.8に アップグレードしたいのですが、 運用に支障きたさず、スマートにアップグレードできる方法はあるのでしょうか? VineLinux3の場合は Perl5.8?が入っている?ので 新規OSインストールすれば、素直ですが 設定に時間がかかるので、 サーバー環境はそのままで、Perl5.8だけアップフレードしたいです。 rpm -qa | grep perlの結果 postgresql-perl-7.2.3-0vl3 groff-perl-1.17.2-0vl4 openssl-perl-0.9.6m-0vl0.26 perl-GD-1.38-1 perl-File-MMagic-1.12-0vl3 perl-Net_SSLeay-1.13-0vl1 perl-SGMLSpm-1.03ii-4vl1 perl-DBI-1.21-0vl1 perl-5.6.1-0vl13 何やらいっぱい出てきて、このあたりの依存関係も注意?かなと ビクビクしております。 あと、5.6系で、使っていたPerlモジュールも5.8ではもう一度インストールする必要が 出てくると思いますが、5.6系のモジュールを全て表示させるツールはあるのでしょうか? uname -a Linux ホスト名 2.4.19-0vl26 #2 2003年 1月 22日 水曜日 03:10:41 JST i686 unknown Vine Linux 2.6r4 (La Fleur de Bouard) Kernel 2.4.19-0vl26 on an i686

    • ベストアンサー
    • Perl
  • ファイルから一行ずつ読み込むとき、@F[0] と $_ は違う?

    データファイルを一行ずつ読み込んで、文字列を一文字ずつコンマ区切りにしたいと思っています。たとえば、   xyz → x,y,z としたいと思っています。 今、data.txt に  abc  defgh という2行が書いてあります。  perl -nla -e '@chars= split(//,@F[1]); print join(",",@chars);' data.txt とすると  a,b,c  d,e,f,g,h という出力が無事に得られました。 どうせ、data.txt は一列しか使っていないので、 @F[0] の代りに $_ を使ってみました。  perl -nle '@chars= split(//, $_); print join(",",@chars);' data.txt しかし、結果は  a,b,c,  d,e,f,g,h, のように、各行の最後に余計なコンマが付いてしまいます。 なぜでしょうか? 一列しかデータがないので、@F[0] と $_ は同じだと思っていたのですが、なにか違うのでしょうか?

    • ベストアンサー
    • Perl
  • Perlのキャプチャ

    プログラム #!/usr/bin/perl my $str = "abc,def,ghi"; ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/; print $a,"\n"; print $b,"\n"; print $c,"\n"; 実行結果 abc def ghi このようなプログラムで ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/;は それぞれ$a,$b,$cにabc,def,ghiが入ります. キャプチャしたすべてを変数に入れるならこの方法ですが, defだけが欲しいのに変数を3つ用意する必要がないと思います. 間違った表記ですが, ($b) = $str =~ /(.*),(.*),(.*)/$2/; 2つ目にキャプチャした$2が変数$bに入るような表記は出来ないのでしょうか?

  • Perlで文字列から指定箇所を抽出したい

    Perlで質問です。 「<div class="testclass"> <a href="test.php?filename=1600176008&s2=1307521989&s3=&p=1"><img src="test.jpg"></a>」 上記のデータのリンクのURL「test.php?~~」の部分を抽出したいです。 split("href=\"",$data); みたいな感じで前と後ろをsplit関数で消せば取り出せると思ったのですが、他に良い方法はありますか?

    • ベストアンサー
    • Perl

専門家に質問してみよう