PerlでHTMLを解析してデータ収集してみる? スクレイピングはLWP::UserAgentまたはMojo::UserAgentとMojo::DOMの組み合わせ

PerlでHTMLを解析してデータ収集してみる? スクレイピングはLWP::UserAgentまたはMojo::UserAgentとMojo::DOMの組み合わせ。

codezine.jp

Perlで行う方法を紹介します。

LWP::UserAgent

まずオーソドックスな方法は、LWP::UserAgentを使う方法です。LWP::UserAgentは、PerlのオーソドックスなHTTPクライアントで、Webスクレイピングに利用できます。

perldoc.jp

 require LWP::UserAgent;
 
 my $ua = LWP::UserAgent->new;
 $ua->timeout(10);
 $ua->env_proxy;
 
 my $response = $ua->get('http://search.cpan.org/');
 
 if ($response->is_success) {
     print $response->content;  # or whatever
 }
 else {
     die $response->status_line;
 }

Mojo::UserAgentとMojo::DOM

またWebフレームワークMojoliciousには、Mojo::UserAgentと呼ばれるノンブロッキングI/O対応のHTTPクライアントがあるので、複数サイトに並列アクセス(5くらいが良心的)して、HTMLをとってきて、Mojo::DOMを使ってDOMを解析するということもできます。これは、スクレイピングでHTML情報を解析するのに便利です。

mojodoc.perlzemi.com

use Mojo::UserAgent;

# 良い粒度のレスポンスの処理(接続エラーの場合は、例外を発生)
my $ua  = Mojo::UserAgent->new;
my $res = $ua->get('mojolicious.org/perldoc')->result;
if    ($res->is_success)  { say $res->body }
elsif ($res->is_error)    { say $res->message }
elsif ($res->code == 301) { say $res->headers->location }
else                      { say 'Whatever...' }

# Acceptヘッダをつけてユニコードのスノーマンにハローを言う
say $ua->get('www.☃.net?hello=there' => {Accept => '*/*'})->result->body;

# HTMLとXMLのリソースからCSSセレクタを使ってデータを抽出する
say $ua->get('www.perl.org')->result->dom->at('title')->text;

取ってきたHTMLは、Mojo::DOMで解析して自由に取り出せます。

mojodoc.perlzemi.com

use Mojo::DOM;

# 解析
my $dom = Mojo::DOM->new('<div><p id="a">Test</p><p id="b">123</p></div>');

# 見つける
say $dom->at('#b')->text;
say $dom->find('p')->map('text')->join("\n");
say $dom->find('[id]')->map(attr => 'id')->join("\n");

# イテレート
$dom->find('p[id]')->reverse->each(sub { say $_->{id} });

# ループ
for my $e ($dom->find('p[id]')->each) {
  say $e->{id}, ':', $e->text;
}

# 修正
$dom->find('div p')->last->append('<p id="c">456</p>');
$dom->at('#c')->prepend($dom->new_tag('p', id => 'd', '789'));
$dom->find(':not(p)')->map('strip');

# 描画
say "$dom";

吉祥寺.pm23【オンライン】で発表した「SPVMでPerlのforループを100倍高速化する」を公開しました

吉祥寺.pm23【オンライン】で発表した「SPVMでPerlのforループを100倍高速化する」公開します。

speakerdeck.com

吉祥寺.pm23【オンライン】 - 資料一覧 - connpass

発表の場を提供してくださった吉祥寺.pmと運営者の皆様、ありがとうございました。

Perl 8まで耐えられると思う、Perl 5とPerl 7の両方で動くPerlのソースコードの作成方法

Perl 8まで耐えられると思う、Perl 5とPerl 7の両方で動くPerlのソースコードの作成方法について書きます。

2020年7月10日時点では、Perl 7の内容について完全に確定しているわけではないですが、メーリングリストなどの雰囲気から感じ取って、Perl 8まで耐えられると思うPerlのソースコードの作成方法について書きます。

Perl 7では「use strict」「use warnings」「間接オブジェクト呼び出し(new Fooなど) の禁止」が、デフォルトで有効になることが予定されています。

修正項目は、それほど多くはないですが、管理されているソースコードの数によっては、リファクタリング・DX作業の工数が発生します。

use strict

「use strict」をつけているクリプトは、影響がないです。Perlのベストプラクティスに従っていた場合は、大丈夫です。おそらく90%以上の業務プログラムは大丈夫だと思います。10%以下のPerl 4の慣習で書かれているスクリプトは、「use strict」をつけましょう。

Webから拾ってきたCGIを使って改造されているものがある場合は影響大です。1000行から5000行くらいのプログラムが予想されます。「use strict」をつけて変数宣言に「my」をつけていきます。僕も修正し始めていますが、1000行くらいであれば、半日程度の工数になると思われます。

シェルスクリプトの中で、perlワンライナーを使っている場合は、影響中です。移行チェックとして「perl」を「perl -Mstrict」に修正して、正しく実行できることを確認しておくと、Perl 7の影響を避けることができます。これは、Perlの置換のワンライナーを使って、自動でつけることも可能です。

grepやfindなどで、perlコマンドが記述されているシェルスクリプトを探します。置換の変更を元に戻せるようにするためsvnやgitなどで、ソースコードをバージョン管理します。

perlを「perl -Mstrict」に置換します。

perl -pi -e 's/perl/perl -Mstrict/g' ファイル名

svnやgitなどで、差分を確認して、対象のものが、正しく置換されているかを確認します。

置換が実行された、シェルスクリプトを実行して、動作を確認します。動かない場合は「my」を変数の前につけて「use strict」で動くように修正します。

use warnings

「use warnings」をつけているクリプトは、影響がないです。Perlのベストプラクティスに従っていた場合は、大丈夫です。おそらく90%以上の業務プログラムは大丈夫だと思います。10%以下のPerl 4の慣習で書かれているスクリプトは、「use warnings」をつけましょう。

警告の対象となるものがある場合は、警告が出ないように修正していきます。初期化されていないまま使われている変数などで、警告ができます。

Webから拾ってきたCGIを使って改造されているものがある場合は影響大です。1000行から5000行くらいのプログラムが予想されます。「use warnings;」をつけて、警告が出ないように修正しています。僕も修正し始めていますが、1000行くらいであれば、半日程度の工数になると思われます。これは「use strict」の修正と合わせた工数です。

シェルスクリプトの中で、perlワンライナーを使っている場合は、影響はそれほど大きくないと思われます。warningsの場合は、単に警告がでるだけなので、バージョンアップ後に修正しても、大丈夫でしょう。ワンライナーなので、大量の警告が発生するということはないでしょう。

関節オブジェクト呼び出しの禁止

間接オブジェクト呼び出しとは以下のような構文のことです。これが、禁止になる予定です。

# 間接オブジェクト呼び出し
new Foo(1, 2);

これを直接オブジェクト呼び出しに変えます。

# 直接オブジェクト呼び出し
Foo->new(1, 2);

プログラムの中では、newで使われている場合が、あります。感覚としては、20~30%くらいのプログラムに影響があります。

間接オブジェクト呼び出しの場合は、newの前が、空白になっていると思われます。これでファイルを検索します。地道に直接オブジェクト呼び出しを直接オブジェクト呼び出しに修正します。

grep -r ' new'

use strcit;やuse warningsの対応に比べると、単純に置換していくだけですので簡単です。

グローバルファイルハンドルの禁止

これはPerl 7では予定されていませんが、Perl 8では、デフォルトで禁止になる可能性があるものです。

# グローバルファイルハンドル
open FH, '<', $file;

close FH;

これを、レキシカル変数を使ったものに書き換えます。

# レキシカル変数を使った、ファイルハンドル
open my $fh, '<', $file;

close $fh;

多くの参考書では、グローバルファイルハンドルを使ったファイルオープンが紹介されてきたため、修正箇所は多いことでしょう。

ほとんどの場合は、大文字で書かれていると思われます。grepコマンドを使って、変数ではない英語の大文字で構成されているものを探しましょう。

grep -r -P '[^$][A-Z1-Z]+' *

大文字のサブルーチン呼び出しもマッチすると思いますが、それは、見て除外しましょう。

use strcit;やuse warningsの対応に比べると、簡単ですが、間接オブジェクト呼び出しの書き換えよりは、少し手間がかかるでしょう。

プロトタイプの使用をやめる

プログラムの中で、プロトタイプが使用されている場合は、使用しないように書き換えます。これは、将来、サブルーチンシグネチャが有効になった場合に、ぶつからないようにするためです。

# プロトタイプあり
sub foo ($@%&) {

}
# プロトタイプなし
sub foo () {

}

subの行をすべて抽出して、目視で、プロトタイプ宣言があるかどうかを確認します。先にplやpmファイルで絞り込んでおくとよいと思います。

grep -r 'sub ' *

プロトタイプの書き換えで、少し難しいと思うのは、@と%を使用していた場合です。この場合は、リファレンスを使って書き直しましょう。

# プロトタイプあり
sub foo (@%) {
  my (@nums, %scores) = @_;
}

my @nums;
my %scores;
foo(@nums, %scores);

# プロトタイプなし
sub foo () {
  my ($nums_ref, $scores_ref) = @_;
  my @nums = @$nums_ref;
  my %scores = %$scores_ref;
}

my @nums;
my %scores;
foo(\@nums, \%scores);

サブルーチンプロトタイプ「&」を使っている場合は、呼び出し元を「{}」ではなく「sub {}」にして、明示的に無名サブルーチンであることを明示しましょう

# プロトタイプあり
sub foo (&) {
  my ($code) = @_;
}

foo({print 1});

# プロトタイプなし
sub foo () {
  my ($code) = @_;
}

foo(sub { print 1 });

これくらいでしょうか。

自分のプロダクトの修正が終わったら、プロダクトが依存している、PerlのツールチェーンやCPANモジュールが、十分にPerl 5とPerl7の両方で動くようになるのを待ちましょう。バッチを提案するのも、Perlを安定させる貢献になると思います。

とりあえず僕の小さなプロダクトをPerl 7の人柱にする予定です。

参考として、現代的なPerlの記述方法のリンクを張っておきます。

tutorial.perlzemi.com

パール木本のPerlプログラミングちゃんねる 2020年6月27日(土)

配列と繰り返し処理

配列とfor文を使った繰り返し処理を解説。正規表現を組み合わせて、複数の文字列を置換するサンプルも紹介。


配列と繰り返し処理 - パール木本のPerlプログラミングちゃんねる

perl5.32リリース & perl7 発表

Perl 5.32がリリースされました。Unicode 13対応。Perl 7も発表。Perlの紆余曲折と、Perl 6,Rakuとの関係も解説したよ。


perl5.32リリース & perl7 発表 - パール木本のPerlプログラミングちゃんねる

Makefile.PLって何?

Makefile.PLの中身を解説。makeとMakefile、gcc、コンパイラ、リンカ、中で何が起こっているの? 知りたくない?


Makefile.PLって何? - パール木本のPerlプログラミングちゃんねる

プレイバック part2 - 山口百恵【ギター弾き語りで歌ってみた】

緑の中をかけてゆくまっかなポルシェ~。


プレイバック part2 - 山口百恵【ギター弾き語りで歌ってみた】- パール木本のPerlプログラミングちゃんねる

人々がパワー(権力)に苦しむ時代にPerlは人間的な価値を提供できる

青年「壮大なテーマですね。今回のタイトルは」

木本「ふふふっ。」

青年「名に笑ってるんですか。」

木本「パワー(権力)を使うということに、どんなことを連想します?」

青年「うーん、パワハラとかですか。」

木本「そうだね。パワーを使って、嫌がらせをするということだね」

青年「パワーそのものが、悪いことなんですか?」

木本「良いパワー(権力)はあるかな。」

青年「なんだろう? 法律とか?」

木本「そうだね。法権力は、犯罪を防止するのにも役立っているね」

青年「良いパワーの使われ方と、悪いパワーの使われ方があるということですね。悪いパワーってどんなのがあります?」

木本「たとえば、公正に扱わないこと。バイアスを生み出し続けること。トレンドを操作すること。自分は愛されている・人気があると信じさせること。徹底的に無視をすること。特定の人・物に注目を浴びさせないこと。」

青年「確かに、それは、パワーの悪い使われ方の感じがしますね。」

木本「パワーの悪い使い方を、権力のトップにいる組織や存在が、行い続けているので、僕は、そこには参加しないんだ。」

青年「そこに参加して、アクセス数やお金や人気を求めないということ?」

木本「そうだね。そういう環境に身を置き続けることは、長いエンジニ人生を考えると、良いことがないんだ。」

青年「Perlは人間的な価値を提供できるというのは、どういうこと?」

木本「Perlは、人間が慣れ親しんだものに対して、敬意を持つという考え方をプログラミング言語に含んでいます」

青年「たとえば、どんなものがありますか?」

木本「たとえば、sedの構文を、Perlの正規表現で使える。これは、sedを覚えた人が、同じ知識をそのまま使えるということを意味しているよ」

青年「一度人が慣れ親しんだものが、そのままPerlでも使えるということですね。」

木本「そう、これは、C言語風の構文、シェルスクリプトの変数展開、Lispで動的リストを簡単に扱える経験といった、エンジニアが慣れ親しんでいると想定されるものを取り入れている。」

青年「Perlは、新しく覚えることの負担をなるべくかけないという考え方があるということですね。」

木本「そうだね。それと、myやourなどの、中学校一年生で覚えるような単語がPerlのキーワードにあるよ」

青年「日常の言葉を、プログラミング言語に取り入れたということですか?」

木本「そうだね。他の例は、Perlは、型を意識しなくても、算数で習った「1 + 1」がそのまま動く。人間がそのように書くであろうということに対して、Perlプログラミング言語の方が努力をしている」

青年「この俺の流儀に従え、ではなくって、ユーザーや使う人間に対して配慮があるということですね」

木本「そうだね。人間の現実の世界は、ある程度複雑であるから、Perlの方もある程度、柔軟でなければならないという考え方だね。Perlには、パワーを使うという発想がないんだ。」

青年「そういう考え方は、斬新ですね」

木本「そうでしょう。良いやり方には複数の方法・たどり着き方がある。多様性の本当の意味での尊重だね。」

簡易的なC言語/C++ソースファイルの依存関係解決アルゴリズムについて考えている

簡易的なC言語ソースファイルの依存関係解決アルゴリズムについて考えている。

コンパイルを毎回繰り返すのは、コンパイルを待つ時間が辛い。そこで、依存関係があるものだけを、コンパイルするというのがMakefileに書くことだ。

C言語のソースファイルとオブジェクトファイルの対応はシンプルだ。

foo.o が foo.c に対応するだけだ。

これは簡単だ。

ただ、複雑なのは、ヘッダである。

ヘッダは、どこで読み込まれているかがわからない。

ソースコードの中身を解析しないと、ヘッダの依存関係がわからない。

gcc は「-MM」オプションや「-M」オプションで、この情報をくれるが、これは、つまり、gccに依存するということだ。

ソースコードは、C言語だったり、C++だったり、cudaであったりするだろう。

一般的な、依存解決に使えない。

簡易的で、良いお作法で、多くのソースコード配置で想定され、自動化できる、依存解決方法はないだろうか?

考えたのは、以下の方法。

まずヘッダーファイルとソースファイルのディレクトリを分ける


include
src

これで、includeの中に入っているファイルは、ヘッダファイルだと区別する。

次に、includeディレクトリの中を再帰的に、ファイル名を調べる。最終更新時刻を取得する。

そして、拡張子をすべて取り除く。これは「.h」と「.hpp」の区別をなくすためだ。

そして、srcディレクトリの中も再帰的に走査して、拡張子を取り除く。これは、拡張子を取り除いたヘッダファイルと名前を比較するためだ。

一般的な慣習に従えば、ヘッダファイル名とソースコード名は、一致する。ただし、共通に利用するヘッダなどは、一致しないだろう。

そこで、多くの場合においては、ヘッダファイル名とソースコード名は、一致すると想定し、少ない場合には、ヘッダファイル名とソースコード名は、一致しないと想定する。

一致した場合は、そこに依存関係ありとみなす。

一致しなかった場合は、それは、おそらく共通で利用されるヘッダだとみなして、すべてのソースコードに対して、依存関係ありとみなす。

依存関係があった場合で、生成元のファイルの更新時刻が、生成先のファイル更新時刻よりも、新しかった場合に、そのソースファイルをコンパイルする。

このようなアルゴリズムを考えている。とても論理的でしょ(笑)。

SPVM 1.0をリリースしちゃう

方針転換、仕様書とドキュメントは完全にできていませんが、SPVM 1.0を7月中には、リリースしちゃう。

SPVM 1.0では、完全な後方互換性の維持は、提供されませんが、不合理な理由での、後方互換性の変更は、なるべく、少なくするようにします。ご利用になる方は、リスクありの状態でご使用ください。

SPVMはセキュアなプログラム実行環境を提供できるようにする

SPVMはセキュアなプログラム実行環境を提供できるようにする。

セキュアという考え方には、任意のコマンドを実行されてしまったり、ファイルを書き換えられてしまったりする、処理に対してセキュアというのがあります。

もう一つは、リソース制限がかからないままプロセスを実行してしまう、リソースに対してセキュアというのがあります。

セキュアなプロセス環境を提供するという場合に、この二つをいっぺんに満たすような、ボックス環境を作るというのが、コンテナという技術で、現在行われているように思います。

コンテナ技術は、あらゆるプログラムに対して、処理に対してセキュアかつ、リソースに対してセキュアなことが目標です。例外的に、ローカルファイルをマウントしたりと、アンセキュアなことができるようになっています。

プログラミング言語がセキュアではない理由

外部コマンド実行

外部コマンド実行ができると、処理に対してセキュアではありません。

ファイル入出力・ソケットなどのネットワークアクセス

ファイル入出力・ソケットなどのネットワークアクセスができると処理に対してセキュアではありません。

コンパイル時に完全な静的解析ができない

コンパイル時に完全な静的解析が可能な場合は、外部コマンド実行や、ファイル入出力・ネットワークアクセス可能なモジュールを、除外することが可能です。

これができないプログラミング言語は、処理に対してセキュアになりません。

アンセキュアな処理をモジュールとして分離できて、実行できる機能が必要です。

処理に対してセキュアであればulimitでリソース制限をするだけ

処理に対してセキュアであれば、リソースに対するセキュアは、ulimitでリソース制限をするだけで可能なように思えます。

このようにして、セキュアな実行環境を提供できるように思えます。

Perl 5.32 リリース - Unicode 13.0, 連鎖比較, isa演算子, sort高速化, trバグ修正

Perl 5.32 がリリースされました。

 

Unicode 13.0, 連鎖比較, isa演算子, sort高速化, trの255以上のコードポイントを含んでいる場合のバグ修正など。

Perlの開発場所がGithubに移り、Github Actionで自動試験を行っていることも、今回のPerlリリースの特徴ですね。

以下はPerlの機能追加・変更点が書かれているperldeltaの自動翻訳です。

名前

perldelta-perl v5.32.0の新機能

説明

このドキュメントでは、5.30.0リリースと5.32.0リリースの違いについて説明します。

あなたは、5.28.0、最初の読み出しなど、以前のリリースからアップグレードする場合はperl5300delta 5.28.0と5.30.0の違いについて説明し、。

コアの機能強化

isaオペレーター

と呼ばれる新しい実験的な中置演算子はisa、特定のオブジェクトが特定のクラスのインスタンスであるか、それから派生したクラスであるかをテストします。

if( $obj isa Package::Name ) { ... }

詳細については、perlopの「クラスインスタンスオペレーター」を参照してください。

Unicode 13.0がサポートされています

詳細については、https://www.unicode.org/versions/Unicode13.0.0/を参照してください。

連鎖比較機能

一部の比較演算子は、その関連性として、同じ優先順位のいくつかの演算子と連鎖します(ただし、異なる優先順位の演算子と決して連鎖しません)。

if ( $x < $y <= $z ) {...}

次のように動作します:

if ( $x < $y && $y <= $z ) {...}

"$y"見た目と同じくらい単純なスカラーであると仮定します。)

これについて詳しくは、perlop「Operator Precedence and Associativity」のperlopを参照してください

新しいUnicodeプロパティIdentifier_StatusIdentifier_Typeサポート

Unicodeは、正規表現の要件(https://www.unicode.org/draft/reports/tr18/tr18.html)を改訂中です。その一部として、より多くのプロパティを公開する必要があります。厳密なUCD(Unicode文字データベース)の一部ではないプロパティです。これら2つは、セキュリティ上の目的で入力を調べるために使用されます。それらの使用方法の詳細は、https://www.unicode.org/reports/tr39/proposed.htmlにあります

これでqr/\p{Name=...}/、またはqr!\p{na=/(SMILING|GRINNING) FACE/}!

Unicode Nameプロパティは、の代わりに、正規表現パターンでアクセスできるようになりました\N{...}。2つの方法の比較は、perlunicodeの「\ N {...}と\ p {name = ...}の比較」に記載されています。

上記の2番目の例は、ワイルドカードサブパターンもこのプロパティで使用できることを示しています。perlunicodeの「プロパティ値のワイルドカード」を参照してください。

改善POSIX::mblen()mbtowcおよびwctomb

POSIX::mblen()mbtowc、およびwctomb機能シフト状態ロケールに今仕事とロケールスレッド安全性を有しているプラットフォーム上で実行されるときC99と上記コンパイラにスレッドセーフです。長さパラメーターはオプションになりました。

これらの関数は常に現在のC言語ロケールで実行されます。(perllocaleを参照してください。)ほとんどのロケールはステートレスですが、いくつか、特にめったに発生しないISO 2022は、これらの関数の呼び出し間で状態を維持します。以前は、すべての呼び出しで状態がクリアされていましたが、適切なパラメーターがでない限り、状態はリセットされませんundef

スレッド化されたperlでは、C99関数mbrlen(3)mbrtowc(3)、およびwcrtomb(3)が利用可能な場合、プレーン関数の代わりに使用されます。これにより、これらの関数は、ロケールのスレッドセーフプラットフォームで実行するときにスレッドセーフになります。

文字列の長さのパラメータmblenとは、mbtowcオプションになりました。ソース文字列で解析される長さを実際の長さより短く制限したい場合にのみ役立ちます。

アルファ表明は実験的ではなくなりました

参照はperlreで: "(パターン* PLA)"はperlreで: "(パターン* PLB)"はperlreで: "(パターン* NLA)" >と、"(* NLB:パターン)"はperlreでを。これらを使用しても警告は生成されなくなりました。警告カテゴリを無効にする既存のコードは、experimental::alpha_assertions変更を必要とせずに引き続き機能します。カテゴリを有効にしても効果はありません。

スクリプトの実行は実験的ではなくなりました

perlreの「Script Runs」を参照してください。これらを使用しても警告は生成されなくなりました。警告カテゴリを無効にする既存のコードは、experimental::script_run変更を必要とせずに引き続き機能します。カテゴリを有効にしても効果はありません。

機能チェックがより速くなりました

以前は、機能が機能バンドルの外部で設定されている場合、パーサーでの機能チェックでハッシュルックアップが必要でしたが、これはビットマスクチェックに最適化されています。[ GH#17229 ]

PerlがGitHubで開発されました

Perlは現在GitHubで開発されています。https://github.com/Perl/perl5にアクセスしてください

セキュリティ以外のバグはGitHub経由で報告されるようになりました。セキュリティの問題はperlsecで文書化されているように引き続き報告されるべきです

コンパイルされたパターンを最適化前にダンプできるようになりました

これは主に、正規表現コンパイラのバグを追跡するのに役立ちます。コマンドラインで-DDEBUGGING指定-Drvした場合、このダンプはperlで発生します。または任意のPerl上のパターンは、の範囲内でコンパイルされている場合use re qw(Debug DUMP_PRE_OPTIMIZE)、またはuse re qw(Debug COMPILE EXTRA)。(2番目のケースを除くすべてに、他の情報も表示されます。)

安全保障

[CVE-2020-10543]細工された正規表現が原因のバッファオーバーフロー

size_tネストされた正規表現数量詞のストレージスペース計算での符号付き整数オーバーフローは、正規表現ストレージスペースの後に割り当てられたメモリを攻撃者が提供したデータで上書きするPerlの正規表現コンパイラでヒープバッファオーバーフローを引き起こす可能性があります。

ターゲットシステムは、オーバーフローが発生する前に、ネストされた数量詞の部分的な拡張を割り当てるために十分な量のメモリを必要とします。この要件は、64ビットシステムでは満たされない可能性があります。

発見者:タランチュラチームのManhND、VinCSS(Vingroupのメンバー)。

[CVE-2020-10878]細工された正規表現によって生成された不正な形式のバイトコードによる整数オーバーフロー

正規表現エンジンの命令間のオフセットの計算で整数オーバーフローが発生すると、コンパイルされた正規表現の中間言語状態が破損する可能性があります。攻撃者はこの動作を悪用して、コンパイルされた形式のPerl正規表現に命令を挿入する可能性があります。

発見者:Hugo van der SandenおよびSlaven Rezic。

[CVE-2020-12723]細工された正規表現が原因のバッファオーバーフロー

S_study_chunk()正規表現の中間言語表現を最適化するためにPerlの正規表現コンパイラが再帰的に呼び出すと、コンパイルされた正規表現の中間言語状態が破損する可能性があります。

発見者:セルゲイアレイニコフ

追記

Perlで記述されたアプリケーションは、攻撃者から提供された正規表現を評価する場合にのみ、上記の脆弱性のいずれかに対して脆弱になります。この方法で正規表現を評価することは危険であることが知られています。これは、正規表現エンジンがこの使用シナリオのサービス拒否攻撃から保護されていないためです。

互換性のない変更

Unicodeプロパティ値のワイルドカードサブパターンのコンパイルで、特定のパターンマッチング機能が禁止されました

これらのいくつかの機能は不適切であるか、このタスクを実行するために使用されるアルゴリズムを妨害します。完全なリストはperlunicodeの「プロパティ値のワイルドカード」にあります。

未使用の関数でPOSIX::mbstowcsありPOSIX::wcstombs、削除されます

これらの機能は、インターフェースの仕様に欠陥があるため機能しなかった可能性があります。それらの機能が利用可能であると主張されて何年もの間誰も不満を言っていないので、それらに対する要求は明らかにありません、それゆえそれらのためのいわゆる「サポート」は今や削除されます。

のバグ修正(?[...])により、一部のパターンがコンパイルできなくなった可能性があります

「選択したバグ修正」を参照してください。以前に使用されたヒューリスティックは、いくつかの構成要素を(おそらくプログラマーの意図した効果ではなく)コンパイルさせ、エラーになるはずでした。既知のものはありませんが、一部の誤った構成体がコンパイルできなくなっている可能性があります。

\p{user-defined} プロパティは常に公式のUnicodeのものをオーバーライドするようになりました

以前は、ユーザー定義プロパティが含まれる正規表現パターンのコンパイル前にユーザー定義プロパティが宣言された場合に限り、その定義が同じ名前の公式のUnicodeプロパティの代わりに使用されていました。現在は、常に公式プロパティをオーバーライドしています。この変更により、以前の動作に(おそらく無意識のうちに)依存していた既存のコードが破損する可能性があります。この修正がないと、Unicodeが、たまたま使用していたものと同じ名前の新しいプロパティを持つ新しいバージョンをリリースした場合、その新しいUnicodeバージョンを使用するperlにアップグレードすると、プログラムが壊れます。perlunicodeの「User-Defined Character Properties」を参照してください。[ GH#17205 ]

変更可能な変数は定数では許可されなくなりました

次のようなコード:

my $var;
$sub = sub () { $var };

where $varは、ある種の変更可能なコンテキストのどこかで参照され、サブルーチンが定義されている場合に例外が発生します。

このエラーは、サブ定義に戻りを追加することで回避できます。

$sub = sub () { return $var };

これはPerl 5.22から廃止されました。[ perl#134138 ]

vecコードポイントが0xFFを超える文字列での使用は禁止されています

このような文字列は内部的にUTF-8で表されvec、ビット指向の操作であり、これらの文字列に予期しない結果をもたらす可能性があります。これはperl 5.28.0で廃止されました。

文字列ビット単位演算子での0xFFを超えるコードポイントの使用

これらのいくつかの使用は、以前の非推奨サイクルの後、すでに違法でした。残りの使用は、perl 5.28.0で廃止されたため、現在禁止されています。perldeprecationを参照してください。

Sys::Hostname::hostname() 引数を受け入れません

この使用法はperl 5.28.0で廃止され、現在は致命的です。

プレーンな「0」文字列が範囲演算子の数値として扱われるようになりました

以前は、範囲"0" .. "-1"は「0」から「99」までの数値文字列の範囲を生成しました。これにより、空のリストが生成され0 .. -1ます。これ"0" .. "9"は、以前は文字列のリストを生成していた整数のリストを生成することも意味します。

これは、「0」で始まる文字列を文字列として扱い、"00" .. "03"生成された範囲のよう"00", "01", "02", "03"に扱われたが、文字列を特別に処理しなかった特殊なケースが原因でした"0"。[ perl#133695 ]

\K 現在、先読みと後読みのアサーションでは許可されていません

これは予期しない動作を引き起こし、望ましい動作を定義することができなかったため、許可されませんでした。[ perl#124256 ]

パフォーマンスの向上

  • my_strnlen独自のstrnlen実装を持たないシステム向けに高速化されています。

  • grok_bin_oct_hex(そのため、grok_bingrok_oct、及びgrok_hex)高速化されています。

  • grok_number_flags スピードアップしました。

  • sortsort {$a <=> $b}またはのような場合に顕著に高速になりましたsort {$b <=> $a}。[ GH#17608 ]

モジュールとプラグマ

更新されたモジュールとプラグマ

  • Archive :: Tarがバージョン2.32から2.36にアップグレードされました。

  • autodieがバージョン2.29から2.32にアップグレードされました。

  • Bがバージョン1.76から1.80にアップグレードされました。

  • B :: Deparseがバージョン1.49から1.54にアップグレードされました。

  • ベンチマークがバージョン1.22から1.23にアップグレードされました。

  • charnamesがバージョン1.45から1.48にアップグレードされました。

  • Class :: Structがバージョン0.65から0.66にアップグレードされました。

  • Compress :: Raw :: Bzip2がバージョン2.084から2.093にアップグレードされました。

  • Compress :: Raw :: Zlibがバージョン2.084から2.093にアップグレードされました。

  • CPANがバージョン2.22から2.27にアップグレードされました。

  • DB_Fileがバージョン1.843から1.853にアップグレードされました。

  • Devel :: PPPortがバージョン3.52から3.57にアップグレードされました。

    Win32で生成されたテストファイルは、POSIXのようなシステムで生成されたときと同じになりました。

  • 診断がバージョン1.36から1.37にアップグレードされました。

  • Digest :: MD5がバージョン2.55から2.55_01にアップグレードされました。

  • Dumpvalueがバージョン1.18から1.21にアップグレードされました。

    以前は、配列の要素をダンプして未定義の値を検出すると、出力される文字列はempty arrayでした。これは、本来意図されていたものに変更されましたempty slot

  • DynaLoaderがバージョン1.45から1.47にアップグレードされました。

  • Encodeがバージョン3.01から3.06にアップグレードされました。

  • エンコーディングがバージョン2.22から3.00にアップグレードされました。

  • 英語がバージョン1.10から1.11にアップグレードされました。

  • エクスポーターがバージョン5.73から5.74にアップグレードされました。

  • ExtUtils :: CBuilderがバージョン0.280231から0.280234にアップグレードされました。

  • ExtUtils :: MakeMakerがバージョン7.34から7.44にアップグレードされました。

  • 機能がバージョン1.54から1.58にアップグレードされました。

    新しいindirect機能が追加されました。これはデフォルトで有効になっていますが、間接オブジェクト構文をオフにすることができます

  • File :: Findがバージョン1.36から1.37にアップグレードされました。

    Win32では、テストでドライブのルートディレクトリ内のファイルも書き込み可能なルートディレクトリも必要ありません。

  • File :: Globがバージョン1.32から1.33にアップグレードされました。

  • File :: statがバージョン1.08から1.09にアップグレードされました。

  • Filter :: Simpleがバージョン0.95から0.96にアップグレードされました。

  • Getopt :: Longがバージョン2.5から2.51にアップグレードされました。

  • Hash :: Utilがバージョン0.22から0.23にアップグレードされました。

    サンプルコードが新しいperlで機能しなくなったため、概要が更新されました。[ GH#17399 ]

  • I18N :: Langinfoがバージョン0.18から0.19にアップグレードされました。

  • I18N :: LangTagsがバージョン0.43から0.44にアップグレードされました。

    IGNORE_WIN32_LOCALE環境変数を文書化します。

  • IOがバージョン1.40から1.43にアップグレードされました。

    IO :: Socketは、実装がプロトコルを選択することを示すため、ゼロのプロトコル値をキャッシュしなくなりました。つまりSO_PROTOCOL、特定のソケットタイプを実装していないプラットフォームでは、プロトコルメソッドがを返すことがありundefます。

    提供されたTOは、send()メソッドの呼び出しで常に優先されるようになりました。[ perl#133936 ]

  • IO-Compressがバージョン2.084から2.093にアップグレードされました。

  • IPC :: Cmdがバージョン1.02から1.04にアップグレードされました。

  • IPC :: Open3がバージョン1.20から1.21にアップグレードされました。

  • JSON :: PPがバージョン4.02から4.04にアップグレードされました。

  • Math :: BigIntがバージョン1.999816から1.999818にアップグレードされました。

  • Math :: BigInt :: FastCalcがバージョン0.5008から0.5009にアップグレードされました。

  • Module :: CoreListがバージョン5.20190522から5.20200620にアップグレードされました。

  • Module :: Load :: Conditionalがバージョン0.68から0.70にアップグレードされました。

  • Module :: Metadataがバージョン1.000036から1.000037にアップグレードされました。

  • mroがバージョン1.22から1.23にアップグレードされました。

  • Net :: Pingがバージョン2.71から2.72にアップグレードされました。

  • Opcodeがバージョン1.43から1.47にアップグレードされました。

  • openがバージョン1.11から1.12にアップグレードされました。

  • オーバーロードがバージョン1.30から1.31にアップグレードされました。

  • がバージョン0.237から0.238にアップグレードされました。

  • perlfaqがバージョン5.20190126から5.20200523にアップグレードされました。

  • PerlIOがバージョン1.10から1.11にアップグレードされました。

  • PerlIO :: encodingがバージョン0.27から0.28にアップグレードされました。

  • PerlIO :: viaがバージョン0.17から0.18にアップグレードされました。

  • Pod :: Htmlがバージョン1.24から1.25にアップグレードされました。

  • Pod :: Simpleがバージョン3.35から3.40にアップグレードされました。

  • podlatorsがバージョン4.11から4.14にアップグレードされました。

  • POSIXがバージョン1.88から1.94にアップグレードされました。

  • reがバージョン0.37から0.40にアップグレードされました。

  • Safeがバージョン2.40から2.41にアップグレードされました。

  • Scalar :: Utilがバージョン1.50から1.55にアップグレードされました。

  • SelfLoaderがバージョン1.25から1.26にアップグレードされました。

  • ソケットがバージョン2.027から2.029にアップグレードされました。

  • Storableがバージョン3.15から3.21にアップグレードされました。

    note()from Test :: Moreの使用は、テストではオプションになりました。これは、CPANから非常に古いperlにインストールするときに、Test :: Moreの循環依存関係を回避します。

    2GBを超えるvstringマジックストリングは許可されなくなりました。

    正規表現オブジェクトは、取得時にオブジェクトIDの目的で適切にカウントされませんでした。これにより、結果の構造が破損するか、場合によってはランタイムエラーが発生します。[ perl#134179 ]

  • Sys :: Hostnameがバージョン1.22から1.23にアップグレードされました。

  • Sys :: Syslogがバージョン0.35から0.36にアップグレードされました。

  • Term :: ANSIColorがバージョン4.06から5.01にアップグレードされました。

  • Test :: Simpleがバージョン1.302162から1.302175にアップグレードされました。

  • スレッドがバージョン3.04から3.05にアップグレードされました。

  • Thread :: Queueがバージョン3.13から3.14にアップグレードされました。

  • スレッドがバージョン2.22から2.25にアップグレードされました。

  • threads :: sharedがバージョン1.60から1.61にアップグレードされました。

  • Tie :: Fileがバージョン1.02から1.06にアップグレードされました。

  • Tie :: Hash :: NamedCaptureがバージョン0.10から0.13にアップグレードされました。

  • Tie :: Scalarがバージョン1.04から1.05にアップグレードされました。

  • Tie :: StdHandleがバージョン4.5から4.6にアップグレードされました。

  • Time :: HiResがバージョン1.9760から1.9764にアップグレードされました。

    5.6より前のperlやクラシックMacOSのサポートなど、廃止されたコードを削除しました。[ perl#134288 ]

  • Time :: Pieceがバージョン1.33から1.3401にアップグレードされました。

  • Unicode :: Normalizeがバージョン1.26から1.27にアップグレードされました。

  • Unicode :: UCDがバージョン0.72から0.75にアップグレードされました。

  • VMS :: Stdioがバージョン2.44から2.45にアップグレードされました。

  • 警告がバージョン1.44から1.47にアップグレードされました。

  • Win32がバージョン0.52から0.53にアップグレードされました。

  • Win32API :: Fileがバージョン0.1203から0.1203_01にアップグレードされました。

  • XS :: APItestがバージョン1.00から1.09にアップグレードされました。

削除されたモジュールとプラグマ

  • Pod :: Parserはコアディストリビューションから削除されました。引き続きCPANからダウンロードできます。これは[ perl#119439 ]を解決します。

ドキュメンテーション

既存のドキュメントへの変更

このドキュメントに記載されている変更を反映するようにドキュメントを更新しようとしました。私たちが見逃したものを見つけた場合は、https://github.com/Perl/perl5/issuesで問題を開いてください

さらに、以下の選択された変更が行われました。

perldebguts

  • いくつかのregnode定義を単純化する

    更新BOUNDNBOUND定義。

  • ANYOFHのregnodeを追加

    このノードはに似ていますがANYOFHb、一致するすべてのコードポイントで複数の先行バイトが同じ場合に使用されます。

    ANYOFHb一致しないものに対してUTF-8からコードポイントに変換する必要を回避するために使用されます。UTF-8でエンコードされたターゲットの最初のバイトが目的のバイトであることを確認し、可能なコードポイントのほとんどを除外します。

ペルラピ

  • sv_2pvbyte SVをダウングレードできない場合、それが鳴るように更新されました。

  • sv_setpvn UTF-8フラグはこの関数によって変更されず、NULバイトの終了が保証されることを記載するように更新されました。

  • のドキュメントPL_phaseが追加されました。

  • ドキュメントgrok_bingrok_octおよびgrok_hex更新され、明らかにされています。

perldiag

  • 実験的な「isa」演算子のドキュメントを追加

    (S experimental :: isa)この警告は、(isa)演算子を使用すると発生します。この演算子は現在実験段階であり、その動作はPerlの将来のリリースで変更される可能性があります。

perlfunc

caller

__FILE__andと同様に__LINE__、ここで返されるファイル名と行番号は、perlsynの「Plain Old Comments(Not!)」で説明されているメカニズムによって変更される可能性があります。

__FILE__

これはperlsynの「Plain Old Comments(Not!)」で説明されているメカニズムによって変更できます。

__LINE__

これはperlsynの「Plain Old Comments(Not!)」で説明されているメカニズムによって変更できます。

return

現在、あなたはから戻ることができないと述べていますdo BLOCK

open

open()セクションでは、大幅に改装されていました。

perlguts

  • perlの使用を提案しなくなりましたmallocmalloc現在のシステムは、perlの実装よりもはるかに優れていると考えられています。

  • embed.fncフラグに関するドキュメントは削除されました。embed.fncに十分なコメントが追加されました。そのファイルを変更する人は、最初にそれらのコメントを見るので、ここのエントリは冗長になります。

  • の更新されたドキュメント UTF8f

  • 行方不明の=for apidoc行を追加しました

perlhacktips

  • Perl文字列とC文字列の違いが詳細になりました。

パーリントロ

  • 繰り返し演算子のドキュメントxが明確になりました。[ GH#17335 ]

perlipc

  • open使用法を取り巻くドキュメントは、裸語ではなく3引数のオープン変数とレキシカル変数を優先するように最新化されています。

  • 厳格なセーフすべての例を作り、交換するなど、様々なアップデートや修正-wuse warnings

perlop

  • 「isa」演算子は実験的です

    これは試験的な機能であり、で有効にしuse feature 'isa'た場合に使用できます。experimental::isaカテゴリで警告を発します。

perlpod

  • ここでは、perlインタープリター内のさまざまなスタックの詳細について説明します。

  • の使用に関するアドバイスが追加されましたZ<>

perlport

  • 70の代わりにtimegm正しい年の形式1970を使用するように例を更新します。[ GH#16431 ] 

perlreref

  • いくつかのタイプミスを修正します。

perlvar

  • 文字列$]化して数値で比較することをお勧めします。

perlapiperlintern

  • 以前は不足していたいくつかの機能のドキュメントが追加されました。

perlxs

  • libffi単純なライブラリバインディングの使用を提案します。

POSIX

  • setlocale スレッド化されたビルドに関する警告は、Perl 5.28.X以降には適用されないことに注意して更新されました。

  • Posix::SigSet->new(...) 提供された信号のいずれかをセットに追加できない場合、エラーをスローすることを示すように更新されました。

さらに、以下の選択された変更が行われました。

  • 廃止されたhttps://search.cpan.orgサイトへのリンクは、同等のhttps://metacpan.org URLをポイントするようになりました。[ GH#17393 ]

  • ExtUtils :: XSSymSetのmanページが、モジュールがインストールされている唯一のプラットフォームであるVMSにのみインストールされるようになりました。[ GH#17424 ]

  • URLがに変更されhttps://、古いリンクが更新されました。

    該当する場合、ドキュメント内のURLは、http://プロトコルの使用からに移動されましたhttps://。これは、https://rt.perl.orgのバグトラッカーの場所にも影響します

  • OS / 2ライブラリ、Address Sanitizer、その他のシステムツールへのリンクの一部が古くなっています。これらは作業リンクで更新されています。

  • perl5-portersの古いメールアドレスへのリンクのいくつかは古くなっています。これらは作業リンクで更新されています。

診断

警告や致命的なエラーメッセージなど、診断出力に次の追加または変更が加えられました。診断メッセージの完全なリストについては、perldiagを参照してください。

新しい診断

新しいエラー

新しい警告

既存の診断の変更

ユーティリティの変更

パーバグ

  • バグトラッカーのホームページURLがGitHubを指すようになりました。

streamzip

  • これは、IO :: Compress :: Baseアップグレードの一部として含まれている新しいユーティリティです。

    streamzipは、stdinからzipファイルを作成します。プログラムはstdinからデータを読み取り、それをzipコンテナーに圧縮し、デフォルトでは、ストリームされたzipファイルをstdoutに書き込みます。

構成とコンパイル

構成、設定

  • 打ち鳴らすために++、追加#include <stdlib.h>のための構成のプローブにfutimesstrtollstrtoulstrtoullstrtouq、それ以外のプローブは、コンパイルに失敗するだろう。

  • lchownより確実に検出するはずのclang ++を満たすために、コンパイルおよび実行テストを使用します。

  • C ++コンパイラの場合、printfおよびC ++コンパイラを使用する#include <stdio.h>ためgetpgrp、Configureのプローブに追加するとsetpgrp、警告だけでなくコンパイルが失敗する場合があります。

  • コンパイラーがインライン属性を処理できるかどうかを確認してください。

  • 文字データの配置を確認します。

  • Configureがgcc-10を正しく処理するようになりました。以前は、それをgcc-1として解釈してオンにしていました-fpcc-struct-return

  • Perlはをプローブしなくなりd_u32align、デフォルトdefineですべてのプラットフォームに適用されます。このチェックは、32ビットプラットフォームでのみ行われたときにエラーが発生しやすくなりました。[ perl#133495 ]

  • Z / OS(ネイティブEBCDIC)でperlをビルドするためのドキュメントとヒントが更新されました。これはまだ進行中の作業です。

  • の新しいプローブmalloc_usable_sizeが追加されました。

  • C ++およびclang ++での検出に対する構成の改善。Andy Doughertyによる進行中の作業。[ perl#134171 ]

  • autodoc.pl

    perlinternperlapiを再生成するこのツールは大幅に見直され、embed.fncDevel :: PPPortで使用されるフラグの一貫性が復元され=for apidoc、コード内の多くの冗長なエントリを削除できるようになりました。

  • これでECHOマクロが定義されました。これは、dtraceもともとFreeBSD用に変更されたルールで使用されており、FreeBSD makeは、それを明らかに事前定義しています。Solaris makeはECHO、Solarisでこのルールに違反したものを事前定義していません。[ perl#134218 ]

  • Bisonバージョン3.1から3.4がサポートされるようになりました。

テスト中

このリリースでの他の追加および変更を反映するように、テストが追加および変更されました。さらに、次の重要な変更が行われました。

  • t / run / switches.tは、t /の下のtmpinplace /ディレクトリーを使用(および再利用)しなくなりました。これにより、誤った障害を防止できます。[ GH#17424 ] 

  • のさまざまなバグPOSIX::mbtowcが修正されました。他のスレッドとの潜在的な競合は現在回避されており、以前はワイド文字が返されたためにガベージでした。

  • のさまざまなバグPOSIX::wctombが修正されました。他のスレッドとの潜在的な競合が回避され、以前は文字列パラメーターが共有されているか、結果を保持するのに十分な長さの文字列で事前に割り当てられていなかった場合にsegfaultが発生しました。

  • 制御文字とUnicodeを含むスカラーの特定のテスト出力がEBCDICで修正されました。

  • t / charset_tools.pl:ASCIIプラットフォームでの作業を回避します。

  • t / re / regexp.t:ASCIIプラットフォームでの多くの正規表現テストを高速化

  • t / re / pat.t:EBCDICで機能しないテストをスキップします。

プラットフォームサポート

廃止されたプラットフォーム

Windows CE

Windows CEでのperlのビルドのサポートが削除されました。

プラットフォーム固有の注意事項

Linux

cc移入するために使用されるplibpth場合ccですclang。[ perl#134189 ]

NetBSD 8.0

g ++を使用したNetBSD 8.0でのPerlのコンパイルを修正。[ GH#17381 ]

ウィンドウズ
  • との構成はccflagsoptimizePOSIXプラットフォームと同様に分離されました。[ GH#17156 ]

  • Visual C ++ 6.0でperlをビルドするためのサポートが削除されました。

  • Windowsのバグが原因でWin32でロケールテストがクラッシュする可能性があります。また、現在のコードページでロケール名が有効にエンコードされていない場合にCRTが例外をスローすることで、クラッシュする可能性があります。

    もう1つは、ロケール名を自分でデコードし、常にUTF-8としてデコードすることです。[ perl#133981 ]

  • 始まる環境変数がFOO既に存在する場合、t / op / magic.tは失敗する可能性があります。

  • MYMALLOC(PERL_MALLOC)ビルドが修正されました。

Solaris
  • ConfigureにあるOracle Developer Studioコンパイラの最新バージョンが見つかり/opt/developerstudio*ます。

  • Configureは検出された型をgethostby*関数に使用し、PerlがSolarisの特定の構成で再度コンパイルできるようになりました。

VMS
  • パッチキットC99 V2.0のリリースにより、VSIはこれまで欠落していた多くのC99機能をサポートしています。インストールそのパッチキットとシステムでは、Perlの構成プロセスは現在のヘッダの存在検出するstdint.hと、次の機能を:fpclassifyisblankislessllrintllrintlllroundllroundlnearbyintroundscalbn、およびscalbnl

  • -Duse64bitint VMSのデフォルトになりました。

z / OS

Perl 5.32はz / OS 2.4でテストされていますが、次の警告があります。

  • 静的ビルド(デフォルト)のみが確実にビルドされます

  • ロケールを使用する場合、z / OSはLC_MESSAGESカテゴリーを適切に処理しないため、perlをコンパイルするときに、構成オプションに以下を追加する必要があります

    ./Configure <other options> -Accflags=-DNO_LOCALE_MESSAGES
  • z / OSはスレッドのあるロケールをサポートしていないため、スレッド化されたperlをコンパイルするときは、構成オプションに以下を追加する必要があります

    ./Configure <other Configure options> -Accflags=-DNO_LOCALE
  • Perlに同梱されている一部のCPANモジュールは、少なくとも1つのセルフテストに失敗します。これらは:Archive :: Tar、Config :: Perl :: V、CPAN :: Meta、CPAN :: Meta :: YAML、Digest :: MD5、Digest :: SHA、Encode、ExtUtils :: MakeMaker、ExtUtils :: Manifest 、HTTP :: Tiny、IO :: Compress、IPC :: Cmd、JSON :: PP、libnet、MIME :: Base64、Module :: Metadata、PerlIO :: via-QuotedPrint、Pod :: Checker、podlators、Pod :: Simple、Socket、およびTest :: Harness。

    障害の原因は、セルフテスト自体に欠陥があり、モジュールは実際には問題なく機能しますが、EBCDICプラットフォームではモジュールがまったく機能しません。

内部変更

  • savepvn31ビットより長い文字列を処理できるため、のlenパラメータはのSize_t代わりにI32なりました。

  • (レクサーPerl_yylex()toke.cが)、以前シングル4100行の関数であったに大きく依存gotoし、広くスコープのローカル変数の多くはその仕事をします。現在は、数十個の小さな静的関数に分離されています。残りの最大のチャンク(yyl_word_or_keyword())は900行強で、単一のswitchステートメントで構成され、そのcaseグループはすべて独立しています。これは、理解と保守がはるかに簡単になるはずです。

  • perlコアで使用されるOSレベルのシグナルハンドラーとタイプ(Sighandler_t)は3つのパラメーターを持つものとして宣言されましたが、OSは常に1つの引数でそれらを呼び出すように指示されました。これは、1つのパラメータを持つように宣言することで修正されました。詳細については、マージコミットv5.31.5-346-g116e19abbfを参照してください。

  • 処理するコードtr///が大幅に修正され、特にソースや置換文字列にコードポイントが255を超える文字が含まれている場合に、さまざまなバグが修正されました。一部のバグは文書化されていませんでした。/s、圧搾は交換ではなく、ソースに基づいて行われました。修正された文書化されたバグは[ perl#125493 ]でした。

  • UTF-8でエンコードされたUnicode文字列を扱うXSの作家のための新しいマクロが作成されているUTF8_CHK_SKIP」はperlapiでより不正なUTF-8入力の顔でより安全であることUTF8_SKIP」はperlapiで(はなく、安全なほどUTF8_SAFE_SKIPはperlapiで」) 。NUL文字を超えては読みません。Devel :: PPPort 3.55以降でバックポートされています。

  • PL_curstackinfo->si_cxsubixフィールドが追加されました。これは、最後にプッシュされたサブ/フォーマット/評価コンテキストのスタックインデックスを記録します。これは、設定と自動的によって復元されcx_pushsub()cx_popsub()などがありますが、コンテキストスタックの異常な操作を行う場合は、手動で管理する必要があります。

  • 文字タイプの分類を処理するさまざまなマクロ、および入力がUTF-8でエンコードされる大文字と小文字の変更は、バッファーの終わりを超えた潜在的な読み取りを防ぐために、追加のパラメーターを必要とします。これらを使用すると、Perl 5.26以降、非推奨の警告が生成されます。詳細は「XSコードでのUTF-8を扱うさまざまなマクロの使用」にあります。perldeprecation

  • 新しいパーサー関数parse_subsignature()を使用すると、キーワードプラグインuse feature 'signatures'が有効なときにサブルーチンシグネチャを解析できます。これにより、カスタムキーワードsubで、署名を含む通常の宣言と同様のセマンティクスを実装できます。[ perl#132474 ]

  • 一部のプラットフォームでは、ロケールを一時的に切り替えるときにミューテックスを保持する必要があるため、[ perl#134172 ]の一部として、これを安全かつ効率的に行うのを容易にする新しいマクロ(STORE_LC_NUMERIC_SET_TO_NEEDED_INWITH_LC_NUMERIC_SET_TO_NEEDEDおよびWITH_LC_NUMERIC_SET_TO_NEEDED_IN)が追加されました。 

  • OP構造を割り当てるためのメモリブックキーピングオーバーヘッドは、64ビットシステムのOPごとに8バイト削減されました。

  • eval_pv()croak_on_errorは、trueのときに例外を文字列化しなくなりました。[ perl#134175 ]

  • PERL_DESTRUCT_LEVEL環境変数は、以前はDEBUGGINGサポートでビルドされたperlバイナリでのみ使用されていました。すべてのperlビルドでチェックされるようになりました。その通常の使用法は、perlが終了する前に割り当てたすべてのメモリブロックを個別に強制的に解放することです。これは、valgrindなどの自動リーク検出ツールを使用するときに役立ちます。

  • API eval_sv()がG_RETHROWフラグを受け入れるようになりました。このフラグが設定されていて、提供されたコードのコンパイルまたは実行中に例外がスローされた場合、それは再スローされ、eval_sv()は戻りません。[ perl#134177 ]

  • perl#2754 ] の修正の一部として、exit(0)がBEGINUNITCHECKまたはCHECKブロックで呼び出された場合、perl_parse()はゼロ以外を返すようになりました。

  • コンパイル中にopツリーを再帰的にたどったほとんどの関数は、非再帰的になりました。これにより、$n == 1 ? "one" : $n == 2 ? "two" : ....(特に自動生成されるコードなど)など、opツリーが深くネストされている場合に、SEGVがスタックオーバーフローするのを回避できます。

    スレッドはデフォルトで小さなスタックを持つ傾向があるため、コードが別のスレッド内でコンパイルされる場合、これは特に顕著です。

選択されたバグ修正

  • 以前はperlfuncの「require」は、特殊な組み込みSV &PL_sv_undefを値が%INC前のrequireエラーと同じように扱い、他の未定義のSVは前のエラーrequireが成功したかのように扱います。これは予想外の成功を引き起こす可能性があるrequire上、例えばlocal %INC = %INC;。これは修正されました。[ GH#17428 ]

  • (?{...})正規表現のevalグループが「位置変更なしのEVALが正規表現の制限を超えた」[ GH#17490 ]を誤ってトリガーすることがなくなりました。

  • (?[...])括弧で囲まれた拡張文字クラスは、以前にコンパイルされたそのようなクラスが別のクラスに補間される場合に、誤ってエラーを発生させません。以前に使用されたヒューリスティックは信頼できる方法に置き換えられたため、生成される診断は変更されました。「診断」を参照してください。

  • デバッグディスプレイ(指定して言う-Drか、use reコンパイルされたUnicodeプロパティワイルドカードサブパターンのは、適切なオプションで()はもはや不要な出力を持っていません。

  • 正規表現エンジンのアサーションエラーを修正します。[ GH#17372 ]

  • 後のpp_hot.cのコアダンプを修正しますB::UNOP_AUX::aux_list()。[ GH#17301 ]

  • ロードIOはスレッドセーフになりました。[ GH#14816 ]

  • \p{user-defined}公式のUnicodeを上書きする[ GH#17025 ]

    このパッチの前は、オーバーライドが有効な場合があっただけです。

  • 塗りつぶされた/ilregnodeとmulti-char foldsを適切に処理します

  • make minitest中のコンパイルエラー[ GH#17293 ]

  • 実装を移動し%-%+コアに。

  • grok_inf_nanGH#17370 ]のバッファーを超えて読み取る

  • LC_MESSAGESGH#17081 ]でのglibcバグの回避策

  • printf()またはsprintf()、この%n形式を使用すると、デバッグビルドでパニックが発生したり、SVfUTF8フラグ付き文字列を生成するときに誤ってキャッシュされた長さの値が報告されたりする可能性があります。[ GH#17221 ]

  • トークナイザーは大幅にリファクタリングされました。[ GH#17241 ] [ GH#17189 ]

  • use strict "subs"multiconcat演算子に最適化されたベアワード定数に適用されます。[ GH#17254 ]

  • 正規表現パターンのメモリリークが修正されました。[ GH#17218 ]

  • Perlは、文字列を数値に変換するときに、「0x」または「0b」で始まる文字列をそれぞれ16進数または2進数として扱いません。これは、文字列を浮動小数点数に変換するときの精度を向上させることを目的としたperl 5.30.0で誤って導入された動作の変更を元に戻します。[ perl#134230 ]

  • SVf_UTF8文字列をUnicodeリテラルを含む正規表現と照合すると、照合のたびにSVがリークする可能性があります。[ perl#134390 ]

  • 進とバイナリ浮動小数点リテラルのオーバーロードは、常に文字列で渡された0x代わりに、適切なの接頭辞00b接頭辞を。[ perl#125557 ]

  • $@ = 100; die;100を無視するのではなく、例外として正しく伝播するようになりました。[ perl#134291 ]

  • 0 0x@S_no_op()でアサートされなくなりました。[ perl#134310 ]

  • $@読み取り専用のときに例外がスローされると、perlがupdateを試行したときに無限再帰が$@発生し、別の例外がスローされて、スタックオーバーフローが発生する可能性があります。Perl $@は、単純な書き込み可能なSVではない場合、コピーに置き換えられます。[ perl#134266 ]

  • 設定は、$)あなたが必要な権限を持っている場合は、適切に補助グループIDを設定します。[ perl#134169 ]

  • パイプのclose()は、IO SVからPerlIOオブジェクトを先制的にクリアするようになりました。これにより、close()が子プロセスの完了を待機している間にシグナルハンドラーがdie()またはexit()を呼び出した場合に、すでに閉じられているPerlIOオブジェクトを再度閉じる試みが行われなくなります。[ perl#122112 ]

  • sprintf("%.*a", -10000, $x)負の精度値の誤った処理により、バッファオーバーフローが発生します。[ perl#134008 ]

  • 参照でscalar()を使用すると、コンパイル中に誤ったアサーションエラーが発生する可能性があります。[ perl#134045 ]

  • %{^CAPTURE_ALL}%-、誤ってのエイリアスではなく、文書化されたとおりのへのエイリアスになりました%+。[ perl#131867 ]

  • %{^CAPTURE}@{^CAPTURE}最初に言及された場合は機能しませんでした。%{^CAPTURE_ALL}@{^CAPTURE_ALL}についても同様ですが、@{^CAPTURE_ALL}現在は使用されていません。[ perl#134193 ]

  • 非常に大きい(2GBを超える)浮動小数点形式の幅により、基になるsnprintf()の呼び出しで整数オーバーフローが発生し、アサーションが発生する可能性があります。フォーマットされた浮動小数点の幅は、snprintf()の戻り値であるintの範囲に制限されます。[ perl#133913 ]

  • サブ解析("${code here}"またはなどs/.../code here/e)内の次の構成の解析は、通常の解析方法と一致するように変更されました。

    • print $fh ... 構文エラーは発生しなくなりました。

    • s/.../ ${time} /e現在のようなコードは、警告が有効になっているときに「$ {time}のあいまいな使用が$ time at ...に解決されました」という警告を適切に生成します。

    • @x {"a"} (スペース付き)サブパースで、警告が有効になっている場合に「次のように書かれた」警告が適切に生成されるようになりました。

    • 属性をサブパースで使用できるようになりました。[ perl#133850 ]

  • 不完全ヘクスバイナリリテラルなど0x0b今かのように扱われているxか、b次のトークンの一部です。[ perl#134125 ]

  • スプリアス)におけるような、subparseにs/.../code here/eまたは"...${code here}"、もはやパーサが混乱しません。

    以前は、サブパースが生成さ(れた)トークンで囲まれていました。そのため)、通常のサブパースのクリーンアップを行わずに偽造によって構成が閉じられ、パーサーが混乱し、アサーションエラーが発生する可能性がありました。

    このような構成要素は、ソースに含めることができない人工的なトークンで囲まれています。[ perl#130585 ]

  • などのサブルーチンの参照割り当ては\&foo = \&bar;main::パッケージ内で何も通知せずに何もしませんでした。[ perl#134072 ]

  • sv_gets()は、ターゲットSVがシグナルハンドラーによって変更された場合、より適切に回復するようになりました。[ perl#134035 ]

  • readline @foo@fooスカラーコンテキストで評価するようになりました。以前はリストコンテキストで評価され、readline()はスタックから1つの引数のみをポップするため、スタックがアンダーフローしたり、スタックに予期しない値が残ったりすることがありました。[ perl#133989 ]

  • 不完全な16進数またはバイナリリテラルの解析は5.31.1で変更され、そのようなリテラルを0として扱うようになりました。これにより、次のトークンが残されるxb、次のトークンの一部として解析されます。これにより、動作が静かに変化する可能性があるため、不完全な16進数またはバイナリリテラルが致命的なエラーを生成するようになりました。[ perl#134125 ]

  • eval_pv()のcroak_on_errorフラグは、例外が偽のオーバーロード値であってもスローするようになりました。[ perl#134177 ]

  • INIT終了(0)内で呼び出された場合、ブロックとプログラム自体はもはや実行されていないBEGINUNITCHECKまたはCHECKブロック。[ perl#2754 ]

  • open my $fh, ">>+", undef一時ファイルを追加モードで開くようになりました:書き込みは書き込みの前にファイルの終わりまでシークします。[ perl#134221 ]

  • OP_MULTIDEREFがサブツリーに含まれているopで初期化されていない値の警告のソースを検索するときのSEGVを修正しました。[ perl#134275 ]

死亡記事

PerlとRakuコミュニティの不可欠な部分であり、私たちすべての親愛なる友人であるJeff Goff(JGOFFまたはDrForr)は、2020年3月13日に他界しました。 、数多くのプロジェクトに貢献し、彼ができる方法で支援します。

彼の死は私たちの心と私たちのコミュニティに穴を残し、彼はひどく寂しくなるでしょう。

謝辞

Perl 5.32.0は、Perl 5.30.0以降の開発の約13か月を表し、89人の作成者からの1,800個のファイルに約220,000行の変更が含まれています。

自動生成されたファイル、ドキュメント、リリースツールを除いて、880 .pm、.t、.c、および.hファイルに約140,000行の変更がありました。

Perlは、活気に満ちたユーザーと開発者のコ​​ミュニティのおかげで、40年間繁栄し続けています。以下の人々は、Perl 5.32.0になった改良に貢献したことが知られています:

アーロン・クレイン、アルベルト・シムエス、アレクサンダー・サッカ、アンドレアス・ケーニッヒ、アンドリュー・フレッシュ、アンディ・ドハティ、アスク・ビョルン・ハンセン、アスガラ・アスガシ、ベルンハルト・M・ヴィーデマン、ブライアン・ステンソン、チャド・グラナム、チェイス・ホワイトナー、クリス・ビンゴス・ウィリアムズ、クレイグA.ベリー、Dagfinn IlmariMannsåker、Dan Book、Daniel Dragan、Dan Kogai、Dave Cross、Dave Rolsky、David Cantrell、David Harcheraves、E。Choroba、Felipe Gasper、Florian Weimer、Graham Knop、HåkonHægland、Hauke D H.Merijn Brand、Hugo van der Sanden、Ichinose Shogo、James E Keenan、Jason McIntosh、Jerome Duval、Johan Vromans、John Lightsey、John Paul Adrian Glaubitz、Kang-min Liu、Karen Etheridge、Karl Williamson、Leon Timmermans、Manuel Mausz、Marc Green、Matthew Horsfall、Matt Turner、Max Maischein、Michael Haardt、Nicholas Clark、Nicolas R.、Niko Tyni、Pali、Paul Evans、Paul Johnson、ポールマルケス、ピーターアイゼントラウト、ピータージョンアクラム、ピーターオリバー、ペトルピサック、レニーベッカー、リカルドサイン、リチャードリーチ、ラスアルベリー、サミュエルスミス、サントゥオジャンペラ、ソーヤーX、セルゲイアレイニコフ、セルギーボロディッチ、白方ケンタロウ、シュロミフィッシュ、シロミフィッシュSlaven Rezic、Smylers、Stefan Seifert、Steve Hay、Steve Peters、Svyatoslav、Thibault Duponchelle、Todd Rinaldo、Tomasz Konojacki、Tom Hukins、Tony Cook、Unicode Consortium、VanL、Vickenty Fesunov、Vitali Peil、Yves Orton、Zefram。Tomasz Konojacki、Tom Hukins、Tony Cook、Unicode Consortium、VanL、Vickenty Fesunov、Vitali Peil、Yves Orton、Zefram。Tomasz Konojacki、Tom Hukins、Tony Cook、Unicode Consortium、VanL、Vickenty Fesunov、Vitali Peil、Yves Orton、Zefram。

上記のリストはバージョン管理履歴から自動的に生成されるため、ほぼ間違いなく不完全です。特に、Perlバグトラッカーに問題を報告した(非常に感謝されている)貢献者の名前は含まれていません。

このバージョンに含まれる変更の多くは、Perlのコアに含まれるCPANモジュールに由来しています。Perlの繁栄を支援してくれたCPANコミュニティ全体に感謝します。

Perlの歴史的貢献者すべてのより完全なリストについては、Perlソース配布のAUTHORSファイルを参照してください。

バグの報告

バグと思われるものが見つかった場合は、https://github.com/Perl/perl5/issuesにあるperlバグデータベースを確認してくださいhttp://www.perl.org/、Perlのホームページにも情報があるかもしれません。

報告されていないバグがあると思われる場合は、https://github.com/Perl/perl5/issuesで問題を開いてください。バグを小さく十分なテストケースにトリミングしてください。

報告しているバグがセキュリティに影響を及ぼし、パブリックイシュートラッカーに送信することが不適切である場合は、問題を報告する方法の詳細についてperlsecの「セキュリティ脆弱性の連絡先情報」を参照してください。

感謝を

Perl 5で行った作業についてPerl 5ポーターに感謝したい場合は、次のperlthanksプログラムを実行してください。

perlthanks

これにより、Perl 5ポーターリストに感謝の意を表すメールが送信されます。

こちらもご覧ください

変更点変更点の完全な詳細を表示する方法を説明するためのファイル。

Perlをビルドする方法のINSTALLファイル。

一般的なもののためのREADMEファイル。

著作権情報のArtisticおよびCopyingファイル。

パール木本のPerlプログラミングちゃんねる 2020年6月20日(土)

パール木本のPerlプログラミングちゃんねる 2020年6月20日(土)

配列関数

配列を操作するための配列関数の紹介。push,pop,unshift,shift,splice


配列関数 - パール木本のPerlプログラミングちゃんねる

Linuxどうやって使い始めるの?

Linuxをどうやって使い始めるかの解説。VPS、クラウドサーバー、さくらVPS,ConoHa VPS, AWS EC2, Azure 仮想サーバー, gcp、コンソール, SSHクライアント, TeraTerm, Putty, WinSCP, CentOS, Ubuntu, Debian


Linuxどうやって使い始めるの? - パール木本のPerlプログラミングちゃんねる

ワンライナー置換、Perlで

ワンライナー、sed、Perl。perl -pi -e。


ワンライナー置換、Perlで - パール木本のPerlプログラミングちゃんねる

【100チャンネル登録突破記念】 「君をのせて」をギター弾き語りで歌ってみた


【100チャンネル登録突破記念】 「君をのせて」をギター弾き語りで歌ってみた

PerlのYAML 1.2の解析機 YAML::PPの紹介

PerlのYAML 1.2の解析機 YAML::PPの紹介です。

metacpan.org

YAMLは、アプリケーションの設定ファイルとして、2020年、広く利用されつつあるように感じています。YAMLは、コメントが書け、表現力豊かで、インデントで、配列を表現できること、「|」を使って、文字列をクォートなしで書けることが特徴的です。

YAML 1.2からは、JSONとのデータ表現の互換性が高まり、データ表現において、JSONの上位互換があるようです。

YAML::PPは、デフォルトで、YAML 1.2を解析します。

YAML 1. 2の仕様はこちら。

yaml.org

YAMLは、Perl、Python、XMLに由来があります。

YAML::PPのサンプル

use YAML::PP;
my $ypp = YAML::PP->new;
 
my $yaml = <<'EOM';
--- # Document one is a mapping
name: Tina
age: 29
favourite language: Perl
 
--- # Document two is a sequence
- plain string
- 'in single quotes'
- "in double quotes we have escapes! like \t and \n"
- | # a literal block scalar
  line1
  line2
- > # a folded block scalar
  this is all one
  single line because the
  linebreaks will be folded
EOM
 
my @documents = $ypp->load_string($yaml);
my @documents = $ypp->load_file($filename);
 
my $yaml = $ypp->dump_string($data1, $data2);
$ypp->dump_file($filename, $data1, $data2);
 
# The loader offers JSON::PP::Boolean, boolean.pm or
# perl 1/'' (currently default) for booleans
my $ypp = YAML::PP->new(boolean => 'JSON::PP');
my $ypp = YAML::PP->new(boolean => 'boolean');
my $ypp = YAML::PP->new(boolean => 'perl');
 
# Enable perl data types and objects
my $ypp = YAML::PP->new(schema => [qw/ + Perl /]);
my $yaml = $yp->dump_string($data_with_perl_objects);
 
# Legacy interface
use YAML::PP qw/ Load Dump LoadFile DumpFile /;
my @documents = Load($yaml);
my @documents = LoadFile($filename);
my @documents = LoadFile($filehandle);
my $yaml = = Dump(@documents);
DumpFile($filename, @documents);
DumpFile($filenhandle @documents);


YAML::PP はモジュール式 YAML プロセッサです。

それは、サポートすることを目指しています.http://yaml.org/を参照してください。一部の (まれ) 構文要素は、まだサポートされておらず、以下に記載されていません。YAML 1.2 YAML 1.1

YAML はシリアル化言語です。YAML 入力は「YAML ストリーム」と呼ばれます。ストリームは、1 つまたは複数の "ドキュメント" で構成され、行にドキュメントの開始マーカーが表示されます。ドキュメントの末尾は、必要に応じてドキュメント終了マーカー で終わります。---...

これにより、固定入力ファイルまたは文字列に対して連続ストリームを追加処理できます。

YAML::PP フロントエンドは現在、すべてのドキュメントをロードし、スカラーコンテキストで呼び出された場合は最初のドキュメントのみを返します。

YAML バックエンドは、YAML タグ、perl オブジェクト、データ型のカスタム処理を追加できるモジュール方式で実装されています。内部 API はまだ安定していません。提案は歓迎します。

パール木本のPerlプログラミングちゃんねる 2020年6月12日(金)

パール木本のPerlプログラミングちゃんねる 2020年6月12日(金)です。

配列の基礎

Perlの配列の基礎を解説しました。スカラとリストと配列。要素の取得と設定。配列の長さ。


配列の基礎 - パール木本のPerlプログラミングちゃんねる

Linuxの共有ライブラリについて語りたかったこと

Linuxの共有ライブラリ。so, gcc, ld, オブジェクトファイル、リンカ、dll、OS依存。Perlによるポータビリティ。バイナリファイル。


Linuxの共有ライブラリについて語りたかったこと - パール木本のPerlプログラミングちゃんねる

【歌ってみた】なごり雪 - イルカ

イルカのなごり雪を歌ってみた。


【歌ってみた】なごり雪 - イルカ